Nginx 实现双向 TLS 需同时配置服务端证书和强制客户端证书校验,指定可信 CA 根证书、启用 ssl_verify_client on,并透传证书信息至后端。

要让 Nginx 真正实现双向 TLS(mTLS),核心是让它既验证客户端身份,又向客户端证明自身身份——这需要同时配置服务端证书和客户端证书校验机制。仅开启 HTTPS 或只配 ssl_certificate 是单向认证,不构成 mTLS。
准备可信的 CA 与客户端证书
客户端必须持有由你信任的 CA 签发的有效证书。不能直接用自签名终端证书,Nginx 验证的是证书链是否可追溯到你指定的 CA 根(或中间)证书。
- 用 OpenSSL 生成私有根 CA:
openssl req -x509 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 3650 -nodes - 为每个合法客户端签发证书(含私钥),并确保其包含合适的 CN/OU/SAN 字段,便于后端做白名单识别
- 将
ca.crt(PEM 格式,可拼接根+中间)放在 Nginx 可读路径,如/etc/nginx/certs/ca.crt
在 server 块中启用强制客户端校验
这是 mTLS 的关键一步。Nginx 必须明确要求并验证客户端证书,而不是“可选”或跳过验证。
- 添加 HTTPS 监听:
listen 443 ssl http2; - 配置服务端证书:
ssl_certificate /etc/nginx/certs/server.crt;和ssl_certificate_key /etc/nginx/certs/server.key; - 指定 CA 并强制验证:
ssl_client_certificate /etc/nginx/certs/ca.crt;+ssl_verify_client on; - 建议设置证书链深度:
ssl_verify_depth 2;(覆盖根 CA 和一级中间 CA)
将证书信息安全透传给后端
Nginx 默认不把客户端证书内容发给后端。若后端需做细粒度鉴权(如按 CN、OU 或证书指纹放行),必须显式透传。
- 推荐传递解析后的 DN 字符串:
proxy_set_header X-Client-DN $ssl_client_s_dn; - 如需原始证书(供后端二次校验有效期或提取 SAN),用 Base64 编码:
proxy_set_header X-Client-Cert $ssl_client_cert; - 避免暴露敏感字段,不要直接透传
$ssl_client_raw_cert(未编码二进制)
按路径精细化控制(可选但实用)
并非所有接口都需要 mTLS。可将双向认证限定在敏感路径,兼顾安全性与兼容性。
- 把
ssl_verify_client optional;放入特定location /api/v1/private { ... }块内 - 后端逻辑检查
X-Client-Verify头是否等于SUCCESS,再决定是否放行 - 配合
error_page 495 = @mtls_fail;自定义错误响应,不泄露 Nginx 默认提示
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











