NGINX 配置 SSL 双向认证

发布于 2023-04-19  238 次阅读


NGINX 一般不需要配置双向认证,除非有需要高安全性限制的行为。
以下所有步骤中的需要设置的密码自己随意设置。

CA与自签名

制作CA私钥

位数可以自己根据需要调整,这里是 4096 位:

openssl genrsa -out ca.key 4096

制作CA公钥/根证书

时间可以自己根据需要调整,这里是 3650 天:

openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

补充一下,所需要的信息可以随便填,但是**后面的步骤的内容需要与这里匹配!**

签发客户端证书

制作私钥

位数可以自己根据需要调整,这里是 4096 位:

openssl genrsa -out client.pem 4096
openssl rsa -in client.pem -out client.key

生成签发请求

openssl req -new -key client.pem -out client.csr

但是,有个地方需要注意,除 Common Name 以外,其他**所需要的信息必须与上面匹配!**
下面来说说 Common Name,这个是签发对象的意思,因为需要给 NGINX 去验证,所以**必须填对应的服务器域名**,而且不能与上面的那个制作 CA 公钥/根证书步骤里面的 Common Name 相同。

用 CA 签发

时间可以自己根据需要调整,这里是 3650 天:

openssl x509 -req -sha256 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out client.crt

输出 p12 与 pem 格式

openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
openssl pkcs12 -in client.p12 -out all.pem -nodes

输出的 p12 文件可以直接给浏览器安装。

配置 NGINX

强制验证

在对应网站的配置文件中加入以下两行即可:

ssl_client_certificate /path/ca.crt;
ssl_verify_client on;

可选验证

如果需要设置自由验证进行特殊操作的,可以参考以下配置修改:

ssl_client_certificate /path/ca.crt;
        ssl_verify_client optional;

        if ($ssl_client_verify != SUCCESS) {
                return 405;
            }

        location /path {
            if ($ssl_client_verify != SUCCESS) {
                return 405;
            }
        }