插件窝 干货文章 怎么使用Nginx实现HTTPS双向验证

怎么使用Nginx实现HTTPS双向验证

证书 client 验证 Nginx 257    来源:    2025-04-21

使用Nginx实现HTTPS双向验证(mTLS)指南

HTTPS双向验证(也称为mTLS,双向TLS)要求客户端和服务器都提供证书进行身份验证。以下是完整的配置步骤:

准备工作

  1. 确保已安装OpenSSL和Nginx
  2. 准备以下文件:
    • 服务器证书(server.crt)
    • 服务器私钥(server.key)
    • CA证书(ca.crt,用于验证客户端证书)

生成证书(如尚未准备好)

# 1. 创建CA私钥和自签名证书
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

# 2. 创建服务器私钥和证书签名请求(CSR)
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr

# 3. 用CA证书签署服务器CSR
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt

# 4. 创建客户端私钥和证书签名请求(CSR)
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr

# 5. 用CA证书签署客户端CSR
openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt

# 6. 将客户端证书转换为PKCS12格式(可选,用于某些客户端)
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12

Nginx配置

编辑Nginx配置文件(通常在/etc/nginx/nginx.conf/etc/nginx/sites-available/default):

server {
    listen 443 ssl;
    server_name yourdomain.com;

    # 标准SSL配置
    ssl_certificate /path/to/server.crt;
    ssl_certificate_key /path/to/server.key;

    # 启用SSL协议和加密套件
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
    ssl_prefer_server_ciphers on;

    # 双向验证配置
    ssl_client_certificate /path/to/ca.crt;  # 用于验证客户端证书的CA
    ssl_verify_client on;  # 开启客户端证书验证
    ssl_verify_depth 2;    # 验证深度

    # 可选:指定哪些URL需要双向验证
    # location /secure {
    #     ssl_verify_client on;
    # }

    # 其他配置...
    location / {
        root /var/www/html;
        index index.html;

        # 可选:将客户端证书信息传递给应用
        proxy_set_header X-SSL-Client-Cert $ssl_client_cert;
        proxy_set_header X-SSL-Client-Verify $ssl_client_verify;
        proxy_set_header X-SSL-Client-S-DN $ssl_client_s_dn;
        proxy_set_header X-SSL-Client-I-DN $ssl_client_i_dn;
    }
}

验证配置

  1. 检查Nginx配置语法:

    nginx -t
    
  2. 重启Nginx服务:

    systemctl restart nginx
    

客户端测试

使用curl测试双向验证:

curl --cert client.crt --key client.key --cacert ca.crt https://yourdomain.com

常见问题解决

  1. 证书验证失败

    • 确保客户端证书由配置的CA签发
    • 检查证书是否过期
    • 验证证书链是否完整
  2. 错误"SSL peer certificate or SSH remote key was not OK"

    • 确保客户端提供了正确的证书和私钥
    • 检查CA证书是否正确配置
  3. 性能考虑

    • 双向验证会增加握手时间,考虑对特定路径启用而非全站
    • 可以启用SSL会话重用减少握手开销
  4. 日志查看

    • Nginx错误日志通常位于/var/log/nginx/error.log
    • 可以增加日志级别:error_log /var/log/nginx/error.log debug;

高级配置选项

  1. 根据客户端证书的DN进行访问控制:

    if ($ssl_client_s_dn !~* "CN=Allowed User") {
       return 403;
    }
    
  2. 使用CRL(证书吊销列表):

    ssl_crl /path/to/ca.crl;
    
  3. OCSP Stapling(提高验证效率):

    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8;
    

以上配置提供了完整的HTTPS双向验证实现方案,根据实际需求调整相关参数。