答案是排查Nginx HTTPS代理证书校验失败,关键在于确认Nginx作为HTTPS客户端的四项配置:proxy_ssl_verify on、proxy_ssl_trusted_certificate、proxy_ssl_server_name on及proxy_ssl_name,且须置于location或upstream块内,并验证后端证书链完整性与SNI匹配性。

排查 Nginx HTTPS 代理转发后端服务时的证书校验失败,关键在于明确:此时 Nginx 是 HTTPS 客户端,不是服务器。错误日志中出现 certificate verify failed、unable to get local issuer certificate 或直接返回 502,基本都指向它连接后端时验证失败,而非浏览器访问你的 Nginx。
确认 Nginx 是否真正开启了证书校验
默认情况下 proxy_ssl_verify 是 off,即使配置了 proxy_pass https://,Nginx 也不会主动校验——这会导致问题长期静默,直到某次变更才暴露。
- 必须在
location或upstream块内显式写:proxy_ssl_verify on; - 仅在
http或server块中声明无效,不会生效 - 开启后若未配
proxy_ssl_trusted_certificate,Nginx 会因找不到信任锚而直接失败
检查 SNI 是否正确发送并匹配后端证书
当 proxy_pass 指向 IP(如 https://10.0.0.5)或变量(如 https://$backend)时,Nginx 默认不发 SNI,后端可能返回默认证书,导致域名不匹配。
- 启用 SNI:
proxy_ssl_server_name on; - 显式指定目标域名:
proxy_ssl_name "api.internal.com"; -
proxy_ssl_name必须与后端证书的 SAN(Subject Alternative Name)完全一致:大小写、www.前缀、通配符格式(如*.example.com)都不能错 - 若后端是多租户网关、MinIO 或云厂商 API,SNI 缺失几乎必现证书不匹配
验证信任证书文件是否有效且内容合规
proxy_ssl_trusted_certificate 指向的不是你的站点证书,而是 Nginx 用来验证后端证书的“根 CA + 中间 CA”集合。常见错误是误用了 fullchain.pem 或混入私钥。
- 文件必须是 PEM 格式,每张证书以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾,之间无空行 - 只允许包含可信 CA 证书(根证书和中间证书),不能含私钥、终端证书、重复项
- 推荐路径:
/etc/nginx/ssl/upstream-ca.crt,权限设为644,确保 Nginx 工作进程可读 - 快速验证命令:
openssl x509 -in /path/to/upstream-ca.crt -text -noout | grep "Subject:",应能输出可信 CA 信息
确认后端是否返回了完整证书链
Nginx 作为严格客户端,要求后端在 TLS 握手时一次性发送“域名证书 + 所有中间证书”。只返回终端证书会导致链式校验中断。
- 用 Nginx 的视角测试:
openssl s_client -connect 10.0.0.5:443 -servername api.internal.com -showcerts - 观察输出中的
BEGIN CERTIFICATE块数量和顺序:第一块必须是后端域名证书,第二块起应为中间证书(Issuer 和下一块 Subject 匹配) - 如果只看到一块证书,说明后端配置遗漏中间证书;需将其拼入
fullchain.pem并在后端服务中重新加载 - 商用证书(如 Let’s Encrypt)通常是三级链,建议同时设置:
proxy_ssl_verify_depth 3;


















