也許你經過一段時間的瞭解,已經知道基於數字證書的身份認證方式是符合等級保護條例的雙因素認證方式,而且是安全性比較高的認證方式。你決定要使用數字證書來實現業務系統的用戶登錄,你現在要了解如何使用數字證書實現用服務器認證和戶身份認證。
通過實驗搭建一個測試CA系統,頒發服務器證書和用戶證書,實現用戶基於證書登錄。
做完實驗,你也許會對目前web服務支持的認證策略感到失望。
實驗內容:
- 搭建Openssl CA環境,簽發服務器證書和客戶端證書。
- nginx,安裝nginx,配置HTTPS發佈,且被瀏覽器認證通過。
- 設置客戶端認證。
搭建CA,並簽發證書
步驟如下:
1.生成ROOT CA 的私鑰
2.用私鑰簽發CA的自籤根證書
3.配置CA的發佈環境,CRL文件、index文件、證書發佈目錄等
4.簽發服務端證書
5.簽發客戶端證書
下載並安裝openssl
# openssl 下載頁面 https://www.openssl.org/source/,
cd /home &&
wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz
tar xvf openssl-1.1.1g.tar.gz
cd openssl-1.1.1g
./config --prefix=/usr/local/openssl
make && make install
創建pki目錄,作爲CA系統的目錄
mkdir /home/pki
cd /home/pki
mkdir certs private crl
touch index.txt
echo '01' > serial
cp /usr/local/openssl/ssl/openssl.cnf /home/pki
chmod 700 /home/pki/private
#生成 根密鑰
openssl genrsa -aes256 -out /home/pki/private/ca_root.key 2048
# 生成root證書請求
openssl req -new -key /home/pki/private/ca_root.key -out /home/pki/ca.csr
# req信息在openssl.cnf 中定義,-conf openssl.cnf,修改當前目錄下cnf文件
# 不加-conf系統默認的conf,在拷貝的原文件位置/usr/local/openssl/ssl/openssl.cnf
openssl x509 -req -sha256 -days 3650 -in /home/pki/ca_root.csr -signkey /home/pki/private/ca_root.key -out /home/pki/certs/ca_root.pem
有關ca根的配置,修改當前目錄下的openssl.cnf文件。
# 修改openssl.cnf [ CA_default ] 設置ca的證書和私鑰
# certificate = $dir/certs/ca_cert.pem
# private_key = $dir/private/ca_root.key
# 設置[CA_default]的相關路徑,指向當前的路徑
openssl.cnf文件用法
openssl的默認參數在openssl.cnf文件中配置。openssl命令行 req/x509/ca三個命令。req、x509 2個命令是用來處理數字證書,ca命令是包含證書的簽發和撤銷,同步更新index文件和crl文件。前2個命令獨立命令,而ca是一個更系統的命令。
req,x509,ca命令都可以用 -config config文件,指明文件路徑,設置默認參數,也可以在命令行中顯示傳遞參數。config文件採用[ca][req]的方式,設置相關參數,由[]開始,到下一個[]之間,是這個標籤的參數。
生成root證書,採用req命令 使用到config文件[req]段中的配置,x509_extensions = v3_ca擴展項定義basicConstraints=CA:true,基本約束定義了簽發CA證書。
在config文件中,定義[usr_cert],採用用戶的默認擴展設置。
可以在config中定義[server_cert]服務器證書擴展,也可以採用單獨的擴展文件。服務器擴展中定義subject alternative name,服務端通過設置SAN(subject alternative name)的方式,實現將域名或者ip地址寫入到證書中。
使用獨立的擴展文件,創建並編輯server.extensions.cnf文件。
basicConstraints=CA:FALSE
subjectAltName=@my_subject_alt_names
subjectKeyIdentifier = hash
nsCertType = server
nsComment = "OpenSSL Generated Server Certificate"
authorityKeyIdentifier = keyid,issuer:always
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
[ my_subject_alt_names ]
DNS.1 = www.website.com
命令行如下,生成客戶端證書,通過-extensions顯示覆蓋config文件中x509_extensions變量
openssl ca -config openssl.cnf -out certs/server.crt -extfile server.extensions.cnf -in server.csr
生成客戶端證書,採用extensions命令行覆蓋openssl.cnf定義的[req]段中x509_extension字段。
openssl ca -config openssl.cnf -extensions usr_client -out certs/client.crt -in client.csr
將客戶端證書轉換成p12文件
openssl pkcs12 -export -clcerts -in certs/client.crt -inkey private/client.key -out client.p12
生成p12文件時,需要設置口令,這個口令是安裝p12時需要的解密口令。口令保護p12文件中的私鑰,和私鑰的對稱加密含義還不太一樣,可以繼續做實驗,完成user證書加密密鑰保護,在https認證時的作用。
配置NGINX 服務器
重新編譯NGINX,支持https。
cd /usr/local/src &&
tar -zxvf nginx-1.17.6.tar.gz &&
cd nginx-1.17.6 &&
./configure --sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-http_ssl_module \
--with-pcre=/usr/local/src/pcre-8.43 \
--with-zlib=/usr/local/src/zlib-1.2.11 \
--with-openssl=/home/openssl-1.1.1g &&
make &&
make install
設置nginx.conf文件,開啓https,並設置客戶端認證,客戶端認證以root發佈的證書
# HTTPS server
#
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /home/pki/server.crt;
ssl_certificate_key /home/pki/private/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_client_certificate /home/pki/certs/ca_cert.pem;
ssl_verify_client on;
ssl_verify_depth 1;
location / {
root html;
index index.html index.htm;
}
}
配置好證書,訪問服務器時,chrome瀏覽器會彈出響應的證書。
參考文獻一:
- HTTPS雙向認證指南https://www.jianshu.com/p/2b2d1f511959?utm_campaign=haruki
- 編輯 openssl 文件 https://wangbin.io/blog/it/https-ca.html
- 自建CA及簽發證書 http://www.dp2u.com/2019/linux-openssl-CA-and-Server-Certificate.html
- extionsion 文件 https://blog.csdn.net/u011893782/article/details/106227305
- 創建中間CA https://blog.csdn.net/qq405052998/article/details/53168959
參考文獻:
1. 使用 openssl 生成證書 https://blog.csdn.net/ljskr/article/details/84570254
2.centos 安裝nginx https://www.cnblogs.com/zhizihuakai/p/12055618.html
4. nginx 雙向證書 https://serverfault.com/questions/938269/nginx-client-cert-verification-ssl-client-certificate-vs-ssl-trusted-certificat
5.ssl_client_certificate https://blog.51cto.com/tchuairen/1782945
6.php 獲得證書CN https://cloud.tencent.com/developer/ask/127591
7. php 獲得證書https://blog.51cto.com/gdutcxh/2121507
8.http://nginx.org/en/docs/http/ngx_http_ssl_module.html#var_ssl_client_raw_cert
9.redhead資源文件解決簽發ca證書 https://access.redhat.com/solutions/28965
10.github 文章 https://gist.github.com/croxton/ebfb5f3ac143cd86542788f972434c96
11. https://gist.github.com/Soarez/9688998
12.How to install OpenSSL on CentOS RedHat Linux, How to configure OpenSSL on CentOS RedHat Linux http://dev.antoinesolutions.com/openssl