设置TLS相互身份验证
申请根证书
创建私钥
openssl genrsa -aes256 -out ca/ca.key 4096 chmod 400 ca/ca.key
创建有效期2年的根证书
可以使用SHA256哈希算法创建有效期为两年的根CA证书(不再使用SHA1)
openssl req -new -x509 -sha256 -days 730 -key ca/ca.key -out ca/ca.crt
除了Common Name 输入颁发者名称(自定义颁发者),其他都留空
chmod 444 ca/ca.crt
验证根证书
openssl x509 -noout -text -in ca/ca.crt
创建服务器证书
为服务器创建一个私钥
openssl genrsa -out server/client-test.com.key 2048
此处2048位密钥就足够了,因为该密钥仅有效一年,而4096位将减慢TLS握手。同时也省略了-aes256
选项,因为我们不想在每次启动Web服务器时都输入密码
chmod 400 server/client-test.com.key
为特定的域名创建证书请求
openssl req -new -key server/client-test.com.key -sha256 -out server/client-test.com.csr
为每个CSR详细信息输入一个点,但是“通用名称”必须是服务器的标准域名
使用根CA签署CSR一年
openssl x509 -req -days 365 -sha256 -in server/client-test.com.csr -CA ca/ca.crt -CAkey ca/ca.key -set_serial 1 -out server/client-test.com.crt
系统将提示您输入根CA的密码。
验证证书
openssl x509 -noout -text -in server/client-test.com.crt
还可以验证信任链
openssl verify -CAfile ca/ca.crt server/client-test.com.crt
显示:server/client-test.com.crt: OK
创建客户端证书
为客户端zhangsan创建一个私钥
openssl genrsa -out client/zhangsan.key 2048
为客户端创建CSR
(如果用户创建了客户端的CSR,则服务器将看不到用户的私钥)
openssl req -new -key client/zhangsan.key -out client/zhangsan.csr
为每个CSR详细信息输入一个点,但是“通用名称”必须是服务器的标准域名
使用根ca签署CSR
openssl x509 -req -days 365 -sha256 -in client/zhangsan.csr -CA ca/ca.crt -CAkey ca/ca.key -set_serial 2 -out client/zhangsan.crt
Nginx配置
server {
listen 443 ssl;
...
ssl_certificate /etc/nginx/certs/server/client-test.com.crt;
ssl_certificate_key /etc/nginx/certs/server/client-test.com.key;
ssl_client_certificate /etc/nginx/certs/ca/ca.crt;
ssl_verify_client on;
...
}
安装客户端证书
需要一个PKCS#12文件
openssl pkcs12 -export -clcerts -in client/zhangsan.crt -inkey client/zhangsan.key -out client/zhangsan.p12
浏览器安装证书
本地安装CA证书
导入PKCS#12文件