在Nginx服务器配置PCA证书双向认证

在Nginx服务器上配置基于PCA证书的双向认证,主要是为了增强客户端与服务器间通信的安全性,要求不仅服务器向客户端证明自己的身份(服务器证书验证),同时客户端也需要向服务器证明其身份(客户端证书验证)。本文介绍如何在客户端浏览器与Nginx服务器间配置阿里云自签名X.509格式证书,实现Nginx的双向TLS/SSL认证。

重要

本文以CentOS 8.0操作系统、Nginx 1.20.1和谷歌浏览器为例介绍。不同版本的操作系统或Web服务器,部署操作可能有所差异,如有问题,请联系产品技术专家进行咨询,详情请参见专家一对一服务

方案概览

在Nginx服务器配置PCA证书双向认证大致分为4步,如下:

  1. 准备PCA证书:配置前,需在数字证书管理服务控制台导出CA根证书、服务端证书和客户端证书。

  2. 配置Nginx服务器:在Nginx服务器配置CA根证书和服务端证书。CA根证书用于验证来自客户端证书的真实性及有效性,服务端证书则是发送给客户端验证其真实性及有效性。

  3. 配置客户端浏览器:在谷歌浏览器配置CA根证书和客户端证书。CA根证书是为了验证来自服务端证书的真实性及有效性,客户端证书则是发送给服务端验证其真实性及有效性。

  4. HTTPS加密访问验证:通过浏览器以HTTPS协议访问网站,验证客户端和浏览器之间的通信是否已经通过SSL/TLS协议加密。

image

前提条件

1.准备PCA证书

1.1 导出CA根证书

  1. 在数字证书管理服务控制台的证书管理 > PCA证书管理页面,找到根CA,单击详情

    image

  2. 详情面板最下方,复制根CA证书内容,然后在本地新建一个TXT文件,将该内容粘贴进去,并将文件命名为caroot.crt

    image

1.2 导出服务端证书和客户端证书

  1. 在数字证书管理服务控制台的证书管理 > PCA证书管理页面,找到子CA,单击证书列表

    image

  2. 证书列表页面,单击下载,选择证书格式后,将服务端证书(PEM格式)和客户端证书(PFX格式)下载至本地。

    image

2.配置Nginx服务器

2.1 上传CA根证书和服务端证书至Nginx

  1. 执行以下命令,在Nginx中创建一个用于存放证书的目录nginxcert

    mkdir /etc/pki/nginxcert
  2. 将本地CA根证书、解压好服务端证书和私钥文件上传至创建的目录中(/etc/pki/nginxcert)。

    说明

    您可以使用远程登录工具附带的本地文件上传功能,上传文件。例如PuTTy、Xshell或WinSCP等。如果您使用的阿里云云服务器 ECS,上传文件具体操作,请参见上传或下载文件(Windows)上传文件到Linux云服务器

2.2 在Nginx中配置CA根证书和服务端证书路径

  1. 执行以下命令,打开Nginx配置文件nginx.conf

    本文示例Nginx为yum命令安装,故Nginx配置文件默认路径为/etc/nginx/nginx.conf

    vim /etc/nginx/nginx.conf
  2. 参考以下示例,修改与证书相关的配置。

    # Settings for a TLS enabled server.
        server {
            listen       443 ssl http2;
            listen       [::]:443 ssl http2;
            # 需修改为您的网站域名
            server_name  example.com;
            root         /usr/share/nginx/html;
    
            # 配置服务端公钥证书绝对路径。以下仅为示例,实际请需替换为真实的证书路径。
    	ssl_certificate "/etc/pki/nginx/example.com.pem";
    	# 配置服务端证书私钥绝对路径。以下仅为示例,实际请需替换为真实的证书私钥路径。
            ssl_certificate_key "/etc/pki/nginx/example.com.key";
    	#  配置CA根证书绝对路径
            ssl_client_certificate "/etc/pki/nginx/caroot.crt";
    	# 开启双向认证
            ssl_verify_client on; 
    
            ssl_session_cache shared:SSL:1m;
            ssl_session_timeout  10m;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
            ssl_prefer_server_ciphers on;
    
            # Load configuration files for the default server block.
             include /etc/nginx/default.d/*.conf;
    
            error_page 404 /404.html;
                location = /40x.html {
            }
    
            error_page 500 502 503 504 /50x.html;
                location = /50x.html {
            }
        }
  3. 执行以下命令,重启Nginx服务。

    nginx -s reload  #重新载入配置文件。

3.配置客户端浏览器

  1. 打开谷歌浏览器,进入设置页面。

    image

  2. 设置页面,单击隐私和安全,选择安全,并单击管理证书

    image

  3. 受信任的根证书颁发机构页签,单击导入,并按照页面指引,导入根证书caroot.crt

    image

  4. 个人页签,单击导入,并按照页面指引,导入解压后的客户端证书(PFX),并输入客户端证书密码。

    image

4.HTTPS加密访问验证

  1. 通过谷歌浏览器访问网站域名,选择证书并单击确定

    image

  2. 效果如下,客户端浏览器已信任服务端证书。

    image

相关文档