Nginx 反向代理 HTTPS 后端时需同时启用 proxy_ssl_verify、proxy_ssl_trusted_certificate、proxy_ssl_name 和 proxy_ssl_server_name 四项指令,并确保信任证书为 PEM 格式根/中间 CA 链,方可完成完整证书校验。

要让 Nginx 在反向代理到 HTTPS 后端时真正信任并校验其证书,proxy_ssl_trusted_certificate 是构建可信链路的起点,但它不能单独工作——必须和验证开关、域名匹配、SNI 支持协同生效,且证书文件内容必须精准。
信任证书文件必须只含根/中间 CA,格式严格
该指令指向的文件是 Nginx 验证上游证书的“信任锚”,只能是 PEM 格式的 CA 证书集合:
- 只允许包含根证书和中间证书,按自顶向下顺序拼接(根 → 中间1 → 中间2),每张证书以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾,之间不能有空行或杂字符 - 严禁混入私钥、你的服务器证书(
ssl_certificate)、或后端服务的终端证书(即fullchain.pem或server.crt直接挪用会失败) - 推荐路径:
/etc/nginx/ssl/trusted_ca.pem(自建)或复用系统级证书包/etc/ssl/certs/ca-certificates.crt - 验证是否合法:运行
openssl crl2pkcs7 -nocrl -certfile trusted_ca.pem | openssl pkcs7 -print_certs -noout,能正常输出证书信息即为有效
四项指令必须同时启用,缺一不可
仅设 proxy_ssl_trusted_certificate 不会触发任何校验。完整验证需以下四者共存:
-
proxy_ssl_verify on;—— 打开上游证书验证总开关(默认关闭) -
proxy_ssl_trusted_certificate /path/to/ca-bundle.crt;—— 指定你信任的 CA 来源 -
proxy_ssl_name "api.example.com";—— 显式声明期望的后端域名,用于比对证书中的 SAN 字段;若proxy_pass使用 IP、变量(如https://$host)或泛域名,此项不可省略 -
proxy_ssl_server_name on;—— 启用 TLS SNI,确保 Nginx 握手时向后端发送正确域名,对接云厂商 API 或多租户后端时尤为关键
生产环境建议补充的关键项
基础四要素之外,加这几项可显著提升链路鲁棒性:
-
proxy_ssl_verify_depth 3;—— 默认只验证 1 层(终端→根),但多数公有云或私有 PKI 返回的是终端+一级中间证书,设为 2 或 3 更稳妥 -
proxy_ssl_protocols TLSv1.2 TLSv1.3;—— 明确禁用 TLSv1.0/v1.1,防止握手阶段被降级绕过校验 -
proxy_ssl_session_reuse off;—— 关闭会话复用,避免异常证书被缓存导致后续请求跳过校验
三方证书(如私有 CA、自签名)的特殊处理
若后端由企业内网 CA、测试环境自签名证书签发,需手动补全信任链:
- 把该私有根证书(或含中间证书)的内容追加进
proxy_ssl_trusted_certificate所指文件中 - 不要依赖系统默认证书包,除非已将私有 CA 显式注入(如通过
update-ca-certificates) - 不建议在生产长期使用自签名证书;上线前务必替换为受信 CA 签发的证书











