Nginx实现上游mTLS双向认证需同时配置proxy_ssl_verify on、proxy_ssl_trusted_certificate、proxy_ssl_certificate及proxy_ssl_certificate_key四者,缺一不可;其中前者仅提供后端证书校验的信任锚点,不参与客户端证书出示。

要让 Nginx 在反向代理场景中构建真正安全的双向 SSL 认证(mTLS)后端链路,proxy_ssl_trusted_certificate 是关键一环,但它本身不“实现”双向认证,而是为上游证书校验提供信任锚点。真正的双向认证需要它与客户端证书出示、服务端证书验证、SNI 和深度控制等协同工作。
明确角色:proxy_ssl_trusted_certificate 只负责“验对方”
该指令指定的是 Nginx 作为 HTTPS 客户端时,用来验证后端服务器证书是否可信的 CA 证书集合。它不参与 Nginx 向后端出示自己的证书,也不影响浏览器如何验证你的 Nginx 站点证书。
- 只在
proxy_ssl_verify on启用时生效 - 文件必须是 PEM 格式,仅含根 CA 和中间 CA 证书(不含私钥、不含终端证书)
- 证书按“根 → 中间1 → 中间2”顺序拼接,每张证书以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾,之间无空行 - 推荐路径:
/etc/nginx/ssl/backend-ca.crt,权限设为644 - 验证方式:
openssl pkcs7 -print_certs -in /etc/nginx/ssl/backend-ca.crt -noout能正常输出即为合法
构建完整双向认证链路的必需配置项
仅配 proxy_ssl_trusted_certificate 不会启用双向认证,必须同时设置以下四者,且需在同一 location 或 upstream 上下文中:
-
proxy_ssl_verify on;—— 启用对后端服务器证书的强制校验 -
proxy_ssl_trusted_certificate /path/to/backend-ca.crt;—— 提供可信 CA 链 -
proxy_ssl_certificate /path/to/client.crt;—— Nginx 向后端出示的客户端证书(PEM 格式) -
proxy_ssl_certificate_key /path/to/client.key;—— 对应私钥(权限建议600)
缺少任一,要么连接失败(502),要么退化为单向或无校验通信。
增强可靠性与兼容性的补充设置
生产环境中,还需追加几项防止边界失败的配置:
-
proxy_ssl_name "api.internal.example.com";—— 显式匹配后端证书中的 SAN,尤其当proxy_pass使用 IP 或变量时不可省略 -
proxy_ssl_server_name on;—— 强制发送 SNI,确保云服务、泛域名或 mTLS 后端能正确路由并返回对应证书 -
proxy_ssl_verify_depth 3;—— 默认只验 1 层(终端→根),多数三方服务返回终端+一级中间证书,设为 3 更稳妥 -
proxy_ssl_protocols TLSv1.2 TLSv1.3;—— 禁用 TLSv1.0/1.1,避免协议降级绕过校验 -
proxy_ssl_session_reuse off;—— 关闭 TLS session 复用,防止缓存异常握手状态干扰证书校验逻辑
私有 CA 或自签名后端的特殊处理
若后端使用企业私有 CA 或自签名证书,必须将该私有根证书(或含中间证书的完整链)内容追加进 proxy_ssl_trusted_certificate 所指文件中。
- 不能依赖系统默认证书包(如
/etc/ssl/certs/ca-certificates.crt),除非已手动注入 - 若后端同时要求验证 Nginx 出示的客户端证书,其签发 CA 也必须包含在该文件中(即同一 CA 既签服务端证书,也签客户端证书)
- 调试时可用
openssl s_client -connect backend:8443 -servername api.internal.example.com -CAfile /etc/nginx/ssl/backend-ca.crt手动验证链有效性


















