[TOC]
使用Nginx配置实现SSL双向认证
生成CA私钥
-
生成CA私钥: ca.key
openssl genrsa -out ca.key 4096
生成CA的数字证书
-
生成一个 CA的数字证书: ca.crt
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
生成server端的私钥
-
生成 server 端的私钥: server.key
openssl genrsa -out server.key 4096
生成server端数字证书请求
-
生成 server 端数字证书请求: server.csr
openssl req -new -key server.key -out server.csr
注意:由于使用ip地址访问的,所以Common Name,输入ip即可。
如果使用域名访问,那么这一步,必须是域名才行
用 CA 私钥签发 server 的数字证书
- 用 CA 私钥签发 server 的数字证书: server.crt
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650
生成 client 端的私钥
生成客户端的私钥与证书
- 生成客户端的私钥与证书: client.key
openssl genrsa -out client.key 4096
生成 client 端数字证书请求
- 生成 client 端数字证书请求: client.csr
openssl req -new -key client.key -out client.csr
用 CA 私钥签发 client 的数字证书
- 用 CA 私钥签发 client 的数字证书: client.crt
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 3650
- 查看文件
ls
ca.crt ca.key ca.srl client.crt client.csr client.key server.crt server.csr server.key
配置nginx
server {
listen 443;
server_name localhost;
ssl on;
ssl_certificate /etc/nginx/keys/server.crt;#配置证书位置
ssl_certificate_key /etc/nginx/keys/server.key;#配置秘钥位置
ssl_client_certificate /etc/nginx/keys/ca.crt;#双向认证
ssl_verify_client on; #双向认证
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #按照这个套件配置
ssl_prefer_server_ciphers on;
root html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
注意:这里使用的是ip地址访问,如果使用域名访问,请修改 server_name 为域名地址
重载配置
nginx -s reload
浏览器验证
由于是双向认证,直接通过浏览器访问https地址是被告知400 Bad Request(No required SSL certificate was sent)的,需要在本机安装client证书。
windows上安装的证书需要pfx格式,也叫p12格式,生成方式如下
openssl pkcs12 -export -inkey ssl/client.key -in ssl/client.crt -out ssl/client.pfx #执行后会提示输入密码(用于安装使用的)
然后拷到windows中双击即可进行安装,安装时会提示输入生成证书时设置的密码。
安装成功后,重启浏览器输入网址访问,浏览器可能会提示你选择证书,选择刚才安装的那个证书即可。
此时有些浏览器会提示用户该证书不受信任,地址不安全之类,这是因为我们的server证书是我们自己颁发的,而非真正的权威CA机构颁布,忽略它既可。