必须同时启用proxy_ssl_verify on、proxy_ssl_trusted_certificate、proxy_ssl_name和proxy_ssl_server_name四项指令,缺一不可,且需配合proxy_ssl_session_reuse off、proxy_ssl_verify_depth 3等加固项,才能在负载均衡链路中真实校验后端https证书。

要在负载均衡链路中用 proxy_ssl_verify 真正校验后端 HTTPS 服务的证书,关键不是单独打开这个开关,而是构建一个完整、每次连接都真实执行的 TLS 验证上下文。它必须和信任锚点、域名匹配、SNI 启用等协同生效,否则会静默降级或直接报 502。
必须同时启用的四项核心指令
这四条指令缺一不可,且必须写在同一个 location 或 upstream 块内:
-
proxy_ssl_verify on;—— 开启上游证书校验(默认是off,不设等于完全不校验) -
proxy_ssl_trusted_certificate /path/to/ca-bundle.crt;—— 指向只含根 CA 和中间 CA 的 PEM 文件(不能含私钥、终端证书或空行) -
proxy_ssl_name "backend.example.com";—— 显式声明期望的域名,用于比对证书中的 SAN 字段(proxy_pass用 IP 或变量时尤其不能省) -
proxy_ssl_server_name on;—— 启用 TLS SNI,确保握手时发送正确域名,对接云服务、泛域名或 mTLS 后端必需
适配负载均衡与缓存链路的关键加固项
在有 proxy_cache 或多实例 upstream 的场景下,还需防止校验被绕过:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
proxy_ssl_session_reuse off;—— 关闭 TLS session 复用,避免复用旧连接导致异常证书状态被缓存 -
proxy_ssl_verify_depth 3;—— 默认只验 1 层(终端→根),多数三方后端返回终端+中间证书,设为 3 更兼容企业 PKI 或云厂商链 -
proxy_ssl_protocols TLSv1.2 TLSv1.3;—— 禁用 TLSv1.0/1.1,防止协议降级干扰校验逻辑
信任证书文件的正确准备方式
proxy_ssl_trusted_certificate 所指文件是整个校验的信任起点,必须满足:
- 仅包含 PEM 格式的根 CA 和中间 CA 证书,按任意顺序拼接(推荐:根→中间)
- 每张证书以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾,之间无空行、无注释、无私钥 - 验证方法:
openssl pkcs7 -print_certs -in /path/to/ca-bundle.crt -noout能正常输出证书信息即为合法 - 推荐路径:
/etc/nginx/ssl/upstream-ca.crt,权限设为644
常见失败原因与快速定位方法
开启后出现 502 Bad Gateway 或日志提示 certificate verify failed,通常源于:
- 后端只返回终端证书,未附带中间证书(可用
openssl s_client -connect host:port -servername host查看返回证书数量) -
proxy_ssl_name与证书 SAN 不完全一致(大小写敏感,*.example.com不匹配api.example.com) - Nginx 进程无权读取
proxy_ssl_trusted_certificate文件(检查ls -l和 SELinux 上下文) - 未关闭
proxy_ssl_session_reuse,导致复用旧 session 绕过重校验










