proxy_ssl_certificate本身不构成双向认证,仅是Nginx向后端出示身份的“入场券”;真正实现mTLS需同时配置proxy_ssl_certificate、proxy_ssl_certificate_key、proxy_ssl_verify on和proxy_ssl_trusted_certificate四指令,并确保后端强制校验该证书。

proxy_ssl_certificate 本身不构成双向客户端证书认证,它只是 Nginx 向后端出示自身身份的“入场券”。要真正实现反向代理场景下的双向 TLS(mTLS),必须让 Nginx 既证明自己(出示证书),又确认后端可信(校验证书),且后端同步强制校验 Nginx 的证书。
四个核心指令必须同时存在
缺一不可,且必须写在同一个 location 或 upstream 块中:
- proxy_ssl_certificate:指定 Nginx 向后端出示的客户端证书(PEM 格式),该证书须由后端信任的 CA 签发,不能是自签名终端证书
-
proxy_ssl_certificate_key:对应私钥文件,权限必须设为 600(
chmod 600 client.key),内容应以-----BEGIN RSA PRIVATE KEY-----开头 - proxy_ssl_verify on:显式开启对后端服务器证书的校验(默认关闭,不设等于无效)
- proxy_ssl_trusted_certificate:提供后端证书链所依赖的根 CA 和/或中间 CA 证书(PEM 格式),仅含证书,不含私钥、不含 Nginx 自身证书、不含后端终端证书
关键补充配置避免静默失败
很多配置看似完整却连接报 502 或校验绕过,往往因以下几项缺失:
-
proxy_ssl_name "api.internal":显式声明期望的后端域名,用于匹配其证书中的 SAN 字段;若 proxy_pass 使用 IP、变量(如
https://$upstream_host)或泛域名,此项必须设置,否则校验直接失败 - proxy_ssl_server_name on:启用 SNI,确保 TLS 握手时发送正确 server name,对接云服务、泛域名或多个后端共用 IP 的场景必不可少
- proxy_ssl_verify_depth 2 或 3:若后端证书经中间 CA 签发(例如:根 CA → 中间 CA → 后端证书),需设为对应层级,否则证书链无法完整验证
- proxy_ssl_protocols TLSv1.2 TLSv1.3:明确协议范围,禁用 TLSv1.0/1.1 等不安全版本,防止协议降级干扰校验逻辑
后端服务必须强制校验客户端证书
Nginx 出示证书只是单方面动作。若后端不验证,整个链路就退化为单向 TLS:
- 上游是 Nginx:需配置
ssl_client_certificate指向同一 CA 证书,并设ssl_verify_client on - 上游是 Envoy:需在
tls_context中启用require_client_certificate: true,并加载对应 CA - 上游是 Spring Boot(Tomcat/Jetty):需配置
server.ssl.trust-store及server.ssl.client-auth=need
证书文件规范与验证方法
文件格式错误会导致校验静默失败(无日志、仅 502):
-
proxy_ssl_certificate 和 proxy_ssl_trusted_certificate 必须是标准 PEM 格式:每张证书以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾,之间无空行 - 可用命令验证 CA 文件有效性:
openssl pkcs7 -print_certs -in /path/to/ca.crt -noout,能输出证书信息即合规 - 私钥建议使用 RSA 格式(非 PKCS#8),若原始为 PFX/P12,可用
openssl pkcs12 -nocerts -nodes -in cert.p12 -out client.key提取并解密


















