nginx反向代理https后端需严格校验三方证书,必须在location块中同时配置proxy_ssl_verify on、proxy_ssl_trusted_certificate、proxy_ssl_name和proxy_ssl_server_name,并设置proxy_ssl_verify_depth 3及proxy_ssl_session_reuse off。

要让 Nginx 在反向代理 HTTPS 后端时真正信任并校验三方(如 Let’s Encrypt、DigiCert、Sectigo 等)签发的证书,proxy_ssl_trusted_certificate 不是单独起作用的配置项,而是整个 TLS 验证链路的“信任锚点”。它必须配合其他指令协同生效,并确保文件内容纯净、路径可读、深度匹配,才能构建一条稳定、不绕过、可复用的静态验证链路。
信任证书文件必须只含三方根与中间 CA
该文件是你唯一指定的信任起点,只应包含 PEM 格式的三方根证书和中间证书(不含私钥、不含后端终端证书、不含 fullchain.pem 中的 server.crt):
- 每张证书以 -----BEGIN CERTIFICATE----- 开头、-----END CERTIFICATE----- 结尾,之间不能有空行或注释
- 推荐路径:/etc/nginx/ssl/thirdparty-ca.crt,权限设为 644
- 验证是否合法:运行 openssl pkcs7 -print_certs -in /etc/nginx/ssl/thirdparty-ca.crt -noout,能正常输出证书信息即为有效
- 常见错误:把后端自己的
server.crt或fullchain.pem直接当信任文件用,会导致校验失败
四项指令必须同在 location 块内声明
缺一不可,否则 Nginx 会在 SSL_do_handshake() 阶段中断连接,返回 502 错误:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- proxy_ssl_verify on; —— 显式启用上游证书校验(默认是 off,不写等于不校验)
- proxy_ssl_trusted_certificate /etc/nginx/ssl/thirdparty-ca.crt; —— 指向你准备好的三方 CA 证书集合
-
proxy_ssl_name "api.example.com"; —— 显式声明期望匹配的域名,用于比对证书 SAN;若
proxy_pass写的是 IP 或变量,此项必须设置 - proxy_ssl_server_name on; —— 强制发送 SNI,确保后端返回对应域名的正确证书(对接云服务、泛域名网关时必需)
验证深度与协议需匹配三方证书链结构
多数三方证书采用“终端 → 中间 CA → 根 CA”三级结构,Nginx 默认只验 1 层,必须显式放宽:
- proxy_ssl_verify_depth 3; —— 覆盖典型三方链(如 Let’s Encrypt R3 → ISRG Root X1)
- proxy_ssl_protocols TLSv1.2 TLSv1.3; —— 禁用 TLSv1.0/1.1,防止协议降级干扰校验逻辑
- 不建议设为 5 或更高:会削弱对中间签发者可信度的约束,降低安全水位
静态链路需规避连接复用带来的校验失效
在无动态 upstream 变量、固定后端地址的静态场景中,仍需防止 TLS session 复用导致异常证书状态被缓存复用:
- proxy_ssl_session_reuse off; —— 确保每次连接都执行真实证书校验,不跳过
- 不要在
http或server块中全局设置这些 proxy_ssl_* 指令——它们只在location或upstream上下文中生效 - 若使用
proxy_cache,该配置同样适用;证书校验与缓存响应体解耦,但必须保证每次建连都校验










