一、Nginx配置客户端SSL双向认证
1. CA 与自签名
创建相关目录
#mkdir ssl
#cd ssl
制作 CA 私钥
#openssl genrsa -out ca.key 2048
制作 CA 根证书(公钥)
#openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
2. 服务器端证书
制作服务端私钥
#openssl genrsa -out server.pem 1024
#openssl rsa -in server.pem -out server.key
生成签发请求
#openssl req -new -key server.pem -out server.csr
用 CA 签发
#openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt
3. 客户端证书
和服务端证书制作一样
4. 配置nginx的nginx.conf文件
至此需要的证书都弄好了,现在开始配置Nginx。
部分主要配置:
server{
listen 80 ssl;
server_name x.x.x.x;
ssl_certificate ssl/server.crt; #server公钥
ssl_certificate_key ssl/server.key; #server私钥
ssl_client_certificate ssl/ca.crt; #根级证书公钥,用于验证各个二级client
ssl_verify_client on;
}
server {
listen 80;
server_name x.x.x.x;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://x.x.x.x:8080;
}
}
配置好后就就重新reload nginx。
5. 请求验证
浏览器验证
由于是双向认证,直接通过浏览器访问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机构颁布,忽略它既可。
6. 验证
当输入的路径为https://x.x.x.x:80 并且信任证书访问nginx的首页成功则说明配置成功!
注:文中的所有路径都是对应的自己所创建的证书所在的路径(SslKey里的路径以及alias和passwd),本文所用的nginx版本为1.15.2,JDK版本为1.8.