Nginx https(SSL)双向认证配置

基于Let’s Encrypt证书和自签名证书实现双向认证。使用Let’s Encrypt实现客户端对服务端的验证,利用自签名证书完成服务端对客户端的认证。

在此只介绍自签名证书生成与配置部分(服务端对客户端的认证),Let’s Encrypt认证参考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,关闭所有Chrome实例)。

重新打开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。

注:使用其他未导入证书的浏览器,验证双向认证是否生效。