Nginx反向代理HTTPS后端时必须同时配置proxy_ssl_verify、proxy_ssl_trusted_certificate、proxy_ssl_name和proxy_ssl_server_name四项,缺一不可,且须置于location或upstream块内;否则证书验证静默失效或返回502。

要让 Nginx 在反向代理到 HTTPS 后端时真正校验其证书是否合法、可信,不能只写 proxy_ssl_verify on。它必须和另外三项指令协同生效,否则会静默失效,甚至返回 502 错误。
必须配齐的四个核心配置项
这四项缺一不可,且都必须放在 location 或 upstream 块内(在 http 或 server 块中声明无效):
- proxy_ssl_verify on;—— 明确启用上游证书验证(默认是 off)
- proxy_ssl_trusted_certificate /path/to/ca-bundle.crt;—— 指向 PEM 格式的可信 CA 证书文件,内容只能是根证书和中间 CA(不能含私钥或后端终端证书)
-
proxy_ssl_name "backend.example.com";—— 显式声明期望匹配的域名,用于比对证书中的 SAN 字段;若
proxy_pass写的是 IP 或变量(如https://$host),此项必须设置 - proxy_ssl_server_name on;—— 启用 TLS SNI 扩展,确保 Nginx 握手时向后端发送正确域名,避免返回默认或不匹配的证书
提升验证稳定性的关键补充项
生产环境建议加上这些配置,覆盖常见边界情况:
- proxy_ssl_verify_depth 3;—— 默认值为 1,仅支持“终端 → 根 CA”直连链;多数商用证书(如 Let’s Encrypt)是三级结构(终端 → 中间 CA → 根 CA),设为 2 或 3 更稳妥
- proxy_ssl_protocols TLSv1.2 TLSv1.3;—— 禁用 TLSv1.0/v1.1,防止协议降级干扰验证逻辑
- proxy_ssl_session_reuse off;—— 关闭 TLS 会话复用,避免缓存异常证书状态导致后续请求绕过校验
信任证书文件的准备要点
proxy_ssl_trusted_certificate 所指文件需满足:
- 格式为纯 PEM:每张证书以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾 - 只包含可信根 CA 和中间 CA 证书(可多个拼接),顺序不限
- 不能混入私钥、后端服务器证书或 fullchain.pem
- 推荐路径:
/etc/nginx/ssl/upstream-ca.crt(权限设为 644),或系统级证书包如/etc/ssl/certs/ca-certificates.crt
常见失败原因与快速排查方向
启用后出现 502 Bad Gateway 或日志中提示 certificate verify failed,通常源于:
- 后端未返回完整证书链(只发了终端证书),需补全中间 CA 到
proxy_ssl_trusted_certificate文件中 -
proxy_ssl_name值与证书 SAN 不匹配(注意大小写、通配符、是否含www.) - 证书已过期或被吊销(Nginx 原生不查 CRL/OCSP,需依赖系统级验证)
-
proxy_ssl_server_name on未开启,导致后端返回默认证书,与proxy_ssl_name冲突


















