https(ssl)双向认证配置 - nginx

以Let’s Encrypt签发的ssl证书和自签名证书为例说明双向认证配置(nginx)。

思路

使用Let’s Encrypt签发的证书,完成客户端对服务端的验证,利用自签名证书执行服务端对客户端的认证。

客户端对服务端认证

Let’s Encrypt签发免费ssl证书参考Let’sEncrypt SSL证书一键安装

服务端对客户端认证

生成服务端证书

openssl genrsa -des3 -out ca.key 4096
openssl genrsa -out ca.key 4096 
openssl req -new -x509 -days 365 -key ca.key -out ca.crt

生成客户端证书

openssl genrsa -out client.key 4096 
openssl req -new -key client.key -out client.csr
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
openssl pkcs12 -in client.p12 -out all.pem -nodes

按提示填写信息,可直接回车默认,遇到填写密码的地方,可选择设置密码,防止证书被盗风险。

nginx配置

开启对客户端的验证:

server {
#....

ssl_client_certificate /root/ssl/all.pem;
ssl_verify_client on;

#.....
}

重启nginx

nginx -t
nginx -s reload

导入证书

以Chrome为例,访问如下地址:

chrome://settings/

设置页下方找到[高级]选项,展开并找到[管理证书],导入证书(.p12文件)。

通过[浏览]找到之前生成的证书,选择.pfx,p12类型文件。

输入证书密码(若设置):

按提示导入完成后,重启浏览器。

打开Chrome输入服务地址,会弹出如下提示框,证明客户端证书导入成功。

以上是对一个Server范围的认证配置,也可针对url实行认证。

修改Nginx配置

ssl_client_certificate ssl_client_certificate /root/ssl/all.pem;
ssl_verify_client optional;
location / {
      if ($ssl_client_verify != SUCCESS) {
        return 401;
      }
}

完成后重启Nginx。

验证测试

使用未导入证书的浏览器访问服务,验证双向认证是否有效。