核心是确认所有后端HTTPS服务在TLS握手阶段返回一致、有效、匹配域名的证书,需逐台用openssl s_client直连验证subject、issuer、Verify return code及有效期,并检查proxy_ssl_server_name等代理配置是否统一。

排查 Nginx HTTPS 负载均衡集群中各节点证书不同步,核心是确认“所有后端 HTTPS 服务是否在 TLS 握手阶段返回一致、有效、匹配请求域名的证书”,而非只看前端 Nginx 的证书配置。不同步常导致客户端报 ERR_CERT_COMMON_NAME_INVALID、SSL_ERROR_BAD_CERT_DOMAIN 或 502 错误,但问题根源在后端节点间证书状态不一致。
验证各后端节点实际返回的证书内容
不能依赖“后端都部署了同一批证书文件”就认为同步——文件存在 ≠ 服务加载成功 ≠ SNI 返回正确。需逐台直连测试:
- 用
openssl s_client -connect 后端IP:443 -servername your-domain.com -showcerts分别连接每个后端地址,观察输出中的subject=CN=...和issuer=是否一致,且 CN 或 SAN 包含客户端访问的域名 - 重点比对
Verify return code:应为0 (ok);若某节点返回18 (self signed certificate)或21 (unable to verify the first certificate),说明该节点证书链缺失或使用了自签名证书 - 检查证书有效期:
openssl x509 -in cert.pem -noout -dates对比各节点证书的notBefore和notAfter,避免部分节点仍用旧证书
检查 Nginx 到后端的 TLS 连接行为是否统一
Nginx 作为反向代理,其与后端建立 HTTPS 连接时的 SNI 和证书校验策略必须明确且一致,否则会放大节点差异:
- 确认所有使用
proxy_pass https://的 location 均启用proxy_ssl_server_name on;—— 否则后端无法根据 SNI 选择正确证书,可能返回默认或错误证书 - 确保
proxy_ssl_name动态取值,如proxy_ssl_name $host;或proxy_ssl_name $http_x_forwarded_host;(若经 CDN),避免写死成固定域名导致部分后端 SNI 不匹配 - 若后端混合公有云 OSS 和私有 MinIO,必须按信任模型分组 upstream:公有云组保持
proxy_ssl_verify on;,私有组显式设proxy_ssl_verify off;或加载统一私有 CA;混在同一 upstream 中会导致部分节点握手失败
排查证书更新未生效的常见断点
即使手动替换了证书文件,也常因以下原因造成“看似更新、实则不同步”:
- 检查各后端服务是否真正重载了证书:Nginx 类后端需
nginx -s reload,Node.js/Java 服务需重启进程;仅替换磁盘文件不等于服务已加载新证书 - 确认私钥与证书严格配对:
openssl x509 -noout -modulus -in cert.crt | openssl md5和openssl rsa -noout -modulus -in key.pem | openssl md5输出必须完全一致,否则 TLS 握手直接失败 - 查看各后端 error_log(开启 debug 级)中是否有
SSL_do_handshake() failed或no suitable certificate found类日志,定位具体哪台节点在握手阶段异常
交叉比对客户端真实收到的证书
浏览器或 curl 看到的证书,才是最终影响用户体验的依据:
- 用
curl -vI https://your-domain.com查看响应头和证书信息;再配合curl -vI --resolve your-domain.com:443:后端IP https://your-domain.com强制直连单个后端,对比各节点返回的证书 Subject 和有效期 - 若使用 CDN,务必确认其回源 Host 头是否透传;若 CDN 固定回源 Host 为
origin.example.com,而某后端只配置了your-domain.com的证书,则该节点必然错配 - 用在线工具(如 SSL Labs)扫描域名,它会主动探测多个 IP 并报告各节点证书差异,直观暴露不同步问题











