proxy_ssl_trusted_certificate仅配置信任CA证书,不实现mTLS;双向TLS需同时配置proxy_ssl_certificate(Nginx向后端出示证书)和proxy_ssl_verify相关指令(验证后端证书),二者缺一不可。

配置 proxy_ssl_trusted_certificate 本身不实现双向 TLS(mTLS),它只负责 Nginx 验证上游 HTTPS 服务证书的“信任锚”;真正的双向 TLS 校验需要同时让 Nginx 向后端出示自己的客户端证书(用 proxy_ssl_certificate 和 proxy_ssl_certificate_key),并让后端验证该证书——这属于上游服务的职责,Nginx 不参与后端的客户端校验逻辑。
明确角色分工:Nginx 在反代 mTLS 中做什么
Nginx 作为反向代理,在支持双向 TLS 的链路中承担两个独立动作:
-
向后端证明自己身份:通过
proxy_ssl_certificate提供客户端证书,proxy_ssl_certificate_key提供对应私钥,使后端能验证 Nginx 身份; -
验证后端身份是否可信:通过
proxy_ssl_trusted_certificate指定 CA 证书文件,并配合proxy_ssl_verify on等指令,确保连接的是预期且合法的后端服务。
这两件事必须同时配置,缺一不可。仅配 proxy_ssl_trusted_certificate 是单向校验(只验后端);仅配 proxy_ssl_certificate 是单向出证(只向后端亮身份),都不构成双向 TLS。
proxy_ssl_trusted_certificate 文件内容规范
该指令指向的 PEM 文件必须严格满足以下条件:
- 只含根 CA 和/或中间 CA 证书,每张证书以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾; - 不能包含私钥、不能包含 Nginx 自己的服务器证书、也不能包含后端的终端证书;
- 推荐按“根 → 中间1 → 中间2”顺序拼接,中间无空行;
- 可用命令验证有效性:
openssl crl2pkcs7 -nocrl -certfile trusted_ca.pem | openssl pkcs7 -print_certs -noout,能输出证书信息即合规。
必须配套启用的验证指令组
仅写 proxy_ssl_trusted_certificate 不会触发任何校验。以下四条需在同个 location 块中全部存在:
-
proxy_ssl_verify on;—— 打开上游证书校验开关; -
proxy_ssl_trusted_certificate /etc/nginx/ssl/ca-bundle.pem;—— 指定你信任的 CA 列表; -
proxy_ssl_name "api.internal.example";—— 显式声明期望的后端域名,用于匹配证书 SAN; -
proxy_ssl_server_name on;—— 启用 SNI,确保 TLS 握手时发送正确域名。
若 proxy_pass 使用 IP 地址或变量(如 https://$backend_host),proxy_ssl_name 尤其不可省略,否则校验直接失败。
补充增强项提升生产健壮性
为应对复杂证书链和协议兼容问题,建议追加:
-
proxy_ssl_verify_depth 3;—— 默认只验 1 层(终端→根),设为 3 可覆盖含多级中间证书的云服务或私有 PKI; -
proxy_ssl_protocols TLSv1.2 TLSv1.3;—— 明确禁用 TLSv1.0/v1.1,防止降级绕过校验; - 若后端使用自签名或私有 CA 证书,须将该 CA 的根证书内容追加进
proxy_ssl_trusted_certificate所指文件,不能依赖系统默认证书包。











