Nginx实现双向SSL认证需配置服务端证书、CA根证书并强制验证客户端证书,金融场景中用于确保合作方身份可信;须禁用自签名证书,启用CRL/OCSP,后端需二次校验DN、有效期及指纹,并加强审计与权限管控。

要通过 Nginx 实现双向 SSL 认证(mTLS),核心是让服务端不仅验证自身证书,还强制客户端提供并验证其合法证书。这在金融场景中用于确保接入方(如合作银行系统、内部风控平台)身份真实可信,防止中间人攻击和非法调用。
准备可信的证书体系
双向认证依赖完整的 PKI 体系,不能使用自签名证书直接上线:
- 使用私有 CA(如 OpenSSL 或 HashiCorp Vault)签发根证书,禁止用公网 CA 签发客户端证书(因公信力模型不适用)
- 服务端证书需包含 SAN(Subject Alternative Name),匹配域名或 IP;客户端证书需有唯一可识别字段(如 subject CN 或扩展字段 authorityKeyIdentifier)用于后续鉴权
- 将 CA 根证书(
ca.crt)、服务端证书+私钥(server.crt+server.key)、客户端证书吊销列表(crl.pem,可选但推荐)统一部署到 Nginx 服务器
配置 Nginx 启用 mTLS
在 server 块中启用 SSL 并强制验证客户端证书:
- 开启 HTTPS 监听:
listen 443 ssl http2; - 指定服务端证书与密钥:
ssl_certificate /path/to/server.crt;和ssl_certificate_key /path/to/server.key; - 加载 CA 证书用于验证客户端:
ssl_client_certificate /path/to/ca.crt; - 启用客户端证书请求并设为强制:
ssl_verify_client on;(optional仅用于调试,生产必须为on) - 启用 CRL 检查(增强实时性):
ssl_crl /path/to/crl.pem;
注意:Nginx 不会自动解析客户端证书内容传给后端,如需传递证书信息(如 CN、OU),需显式设置:proxy_set_header X-Client-Cert $ssl_client_cert; 或更安全的 Base64 编码字段。
后端服务校验证书身份
Nginx 完成 TLS 层校验后,业务逻辑仍需做应用层鉴权:
- 从
X-Client-Cert或$ssl_client_s_dn(Nginx 变量)提取客户端 DN 信息,例如:"CN=bank-a-prod,OU=api,O=BankA,L=Shanghai,C=CN" - 白名单校验:比对预置的合法 CN 或 OU 列表,拒绝未知主体
- 时间有效性检查:虽 TLS 握手已校验有效期,后端仍建议二次校验
Not Before/After字段防时钟漂移 - 可结合证书指纹(SHA256 of DER)做绑定,避免同一 CN 多次签发带来的混淆风险
运维与加固要点
金融级部署需兼顾安全性与可观测性:
- 禁用不安全协议和加密套件:
ssl_protocols TLSv1.2 TLSv1.3;,ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; - 开启 OCSP Stapling 提升验证效率:
ssl_stapling on;,并配置ssl_trusted_certificate - 记录客户端证书摘要和连接元数据(IP、时间、DN)到审计日志,保留至少 180 天
- 定期轮换 CA 私钥与服务端证书;客户端证书按最小权限原则分环境、分系统签发,生命周期建议 ≤ 1 年
不复杂但容易忽略:所有证书文件权限应设为 600,Nginx worker 进程不得以 root 身份读取私钥;测试阶段用 openssl s_client -connect host:443 -cert client.crt -key client.key -CAfile ca.crt 验证握手流程是否完整。


















