proxy_ssl_trusted_certificate本身不验证证书,仅指定ca文件路径;必须与proxy_ssl_verify on、proxy_ssl_name、proxy_ssl_server_name共存于同一location或upstream块,且文件仅含根/中间ca证书、无空行私钥、顺序自顶向下,方可生效。

proxy_ssl_trusted_certificate 本身不验证、也不“挂载”证书链,它只是告诉 Nginx:用哪个文件里的 CA 证书去验证上游服务的身份。真正起作用的是这个文件的内容是否合规,以及是否和其他三项指令协同启用。
信任证书文件必须纯净且结构正确
该 PEM 文件只能包含根 CA 和中间 CA 的公钥证书,不能有私钥、不能有你的服务器证书、也不能有后端的终端证书(比如 fullchain.pem 或 server.crt 直接挪用会失败)。
- 每张证书以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾 - 多个证书拼接时,按“自顶向下”顺序:根证书在最前,中间证书依次跟在后面
- 证书之间不能有空行、空格、注释或 Windows 换行符(
\r\n) - 推荐路径:
/etc/nginx/ssl/trusted_ca.pem(自建)或复用系统证书包/etc/ssl/certs/ca-certificates.crt - 验证是否合法:
openssl pkcs7 -print_certs -in /path/to/trusted_ca.pem -noout能正常输出证书信息,说明格式正确
四项指令必须共存于同一作用域
只写 proxy_ssl_trusted_certificate 不会触发任何校验,Nginx 默认关闭上游证书验证。以下四条需同时出现在同一个 location 或 upstream 块中:
-
proxy_ssl_verify on;—— 打开验证总开关(默认 off) -
proxy_ssl_trusted_certificate /path/to/trusted_ca.pem;—— 指定信任锚文件 -
proxy_ssl_name "backend.example.com";—— 显式声明期望域名,用于匹配证书中的 SAN 字段;若proxy_pass用 IP 或变量(如https://$host),此项不可省略 -
proxy_ssl_server_name on;—— 启用 TLS SNI,确保握手时发送正确域名
生产环境建议补充的关键配置
这些不是必需项,但在实际部署中能显著提升链路稳定性与安全性:
-
proxy_ssl_verify_depth 3;—— 默认只验证 1 层(终端 → 直接签发者),三方或私有 CA 链常含多级中间证书,设为 3 更稳妥 -
proxy_ssl_protocols TLSv1.2 TLSv1.3;—— 明确禁用老旧协议,避免降级干扰 -
proxy_ssl_session_reuse off;—— 关闭 TLS session 复用,防止异常证书被缓存导致后续请求跳过校验
常见错误与排查要点
校验失败往往不是路径写错,而是逻辑或内容问题:
- 文件混入了后端的终端证书或私钥 → 校验静默失败或报 502
-
proxy_ssl_name与后端证书 SAN 不匹配(尤其用 IP 代理时漏配)→ 连接直接拒绝 - 四项指令分散在不同块中,或仅启用其中一两项 → 校验不生效,行为等同未配置
- 证书文件权限不足(如 root 可读但 nginx worker 无权访问)→ 日志报 “cannot load certificate” 类错误











