nginx 因后端 https 证书不可信导致 502 时,error.log 中必现“ssl handshaking to upstream”与“certificate verify error”组合日志,错误码(如21、10、18)对应根证书缺失、过期或自签名等问题。

常见 error.log 报错模式:
upstream SSL certificate verify error: (21: unable to verify the first certificate) while SSL handshaking to upstreamupstream SSL certificate verify error: (10: certificate has expired) while SSL handshaking to upstreamupstream SSL certificate verify error: (18: self signed certificate) while SSL handshaking to upstreamSSL_do_handshake() failed (SSL: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed) while SSL handshaking to upstream
这些日志都明确包含两个关键信号:“SSL handshaking to upstream” 和 “certificate verify error”(或具体错误码)。它们只出现在你配置了 proxy_ssl_verify on;(默认值)且上游 HTTPS 不合规时。
定位步骤很直接:
- 在
/var/log/nginx/error.log中搜索:grep "SSL handshaking.*upstream\|certificate verify" /var/log/nginx/error.log - 确认对应行是否含
while SSL handshaking to upstream—— 这是核心标识,区别于客户端到 Nginx 的握手失败 - 看错误码(括号内数字)快速判断类型:
(21)= 根证书缺失或链不全;(10)= 过期;(18)= 自签名;(62)= 域名不匹配(subjectAltName) - 结合同一行的
upstream: "https://backend.example.com:443"和client: xxx, request: "GET /api/data HTTP/1.1",就能锁定是哪个后端地址、哪个请求路径触发了证书校验失败
验证与区分:
- 用
curl -v https://backend.example.com从 Nginx 所在机器直连上游,观察是否提示SSL certificate problem—— 若一致,基本确认是上游证书问题 - 如果日志里是
connection refused或timeout,说明根本没走到证书校验环节,和证书无关 - 如果日志里是
SSL alert number 40(handshake failure)或80(internal error),可能是协议不兼容(如上游只支持 TLS 1.3 而 Nginx 太老),而非证书信任问题
简言之:找 SSL handshaking to upstream + verify error 组合,看错误码,再比对 upstream 地址和请求路径——这就是证书不信任引发 502 的全部线索,干净、唯一、可操作。











