nginx反向代理外部https时上游证书过期会导致tls握手失败,直接返回502且access_log可能无记录;可通过curl -v模拟回源确认错误信息,临时方案为proxy_ssl_verify off(仅限测试),根本解决需上游更新证书或配置正确的proxy_ssl_trusted_certificate。

Nginx 反向代理外部 HTTPS 服务时,若上游证书过期,TLS 握手会在连接建立阶段失败,Nginx 无法完成 SSL/TLS 协商,直接中断连接并返回 502 Bad Gateway。这不是后端响应异常,而是握手层失败,所以日志中通常出现类似:
SSL_do_handshake() failed SSL_connect() failed SSL certificate has expired
这类错误具有全局性——所有经该 proxy_pass 路径的请求都会 502,且 Nginx access_log 中可能无记录(连接未建立到应用层)。
确认确实是证书过期引发的 502
在 Nginx 服务器上,用 curl -v 模拟回源行为,强制走目标域名 + 端口,并跳过本地 DNS 缓存:
curl -vI https://api.example.com --resolve api.example.com:443:192.0.2.100
✅ 替换
api.example.com为你的 upstream 域名,192.0.2.100替换为实际解析出的 IP(可从dig api.example.com +short获取)
观察输出:
- 若含
certificate has expired或SSL certificate problem: certificate has expired→ 确认为证书过期; - 若是
unable to get local issuer certificate→ 属证书链不全或不受信,非单纯过期; - 若无证书报错但连接被拒绝 → 需排查防火墙、SNI、超时等其他原因。
解决方案分两类:紧急绕过 or 彻底修复
临时应急:禁用证书校验(仅限测试/内网/可控环境)
在对应 location 块中添加:
proxy_ssl_verify off;
⚠️ 注意:
- 此配置不解决根本问题,只是让 Nginx 忽略证书有效性检查,继续发起 TLS 握手;
- 生产环境严禁使用,存在中间人攻击风险;
- 必须配合
proxy_ssl_server_name on;和proxy_ssl_name "api.example.com";才能完成 SNI 握手(否则仍 502)。
根本解决:推动上游更新证书,并确保 Nginx 可验证
- 联系上游服务方,确认证书是否已过期,并要求其更新(含完整证书链);
- 若你可控该上游,立即用
certbot或商业 CA 重签并部署新证书; - 若上游证书由私有 CA 签发,需将该 CA 的根证书和中间证书合并为 PEM 文件(顺序:中间证书在前,根证书在后),然后在 Nginx 中指定:
proxy_ssl_trusted_certificate /etc/nginx/ssl/upstream-ca-bundle.pem; proxy_ssl_verify on; # 显式开启(默认即 on,但建议写明)
✅ 验证该 bundle 是否有效:
openssl verify -CAfile /etc/nginx/ssl/upstream-ca-bundle.pem /path/to/upstream.crt
补充检查项(避免误判)
-
proxy_ssl_server_name on;是否启用?缺失会导致 SNI 不发送,部分 CDN 或多租户 HTTPS 服务会拒连; -
proxy_ssl_name是否与上游证书的 Subject Alternative Name(SAN)完全一致?大小写敏感,通配符需匹配; - Nginx 是否使用了旧版 OpenSSL(如
- 后端是否启用了 HSTS 或证书透明度(CT)强校验?过期证书在严格策略下会被立即拦截。
证书过期引发的 502 是明确、可验证、必须上游协同处理的问题。绕过只是权宜之计,真正稳定运行依赖及时续期与正确信任链配置。











