
HTTPS 证书已经签发,浏览器地址栏也能显示锁形图标,但客服仍收到部分手机打不开、旧电脑提示证书错误、接入 CDN 后偶发 502 的反馈。这类问题往往不是证书有没有安装,而是不同访问路径拿到的证书、证书链和 TLS 策略并不一致。
排查时不要只用自己的浏览器刷新一次。浏览器可能缓存过中间证书,也可能始终命中同一个 CDN 节点。更有效的做法是先判断故障发生在客户端到 CDN,还是 CDN 到源站,再检查证书链、SNI、域名覆盖范围和 TLS 版本。
先根据现象缩小范围
| 现象 | 优先检查 |
|---|---|
| 新版 Chrome 正常,旧手机或嵌入式设备失败 | 中间证书链、根证书兼容性、TLS 最低版本 |
| 主域名正常,某个子域名报证书错误 | SAN 域名覆盖、CDN 域名绑定、SNI |
| 直接访问源站正常,经过 CDN 出现 502 | CDN 回源域名、源站证书、源站 TLS 策略 |
| 同一域名有时正常、有时失败 | DNS 多记录、IPv4/IPv6、不同节点或不同源站配置不一致 |
浏览器正常,curl 或程序报 unable to get local issuer certificate |
服务端未发送完整中间证书链,或客户端 CA 库过旧 |
先记录失败设备、网络、时间、域名和完整错误信息。只有打不开三个字,很难判断是 DNS、TCP、TLS 还是 HTTP 层的问题。
第一步:确认客户端实际拿到了哪张证书
在可复现问题的网络中执行:
curl -Iv https://www.example.com/
重点查看连接 IP、TLS 版本、证书主题、签发者、有效期、校验报错和最终 HTTP 状态码。
再用 OpenSSL 查看服务端返回的证书链:
openssl s_client \
-connect www.example.com:443 \
-servername www.example.com \
-showcerts \
-verify_return_error </dev/null
-servername 会发送 SNI,-showcerts 会显示服务器实际发送的证书列表。不要只看第一张证书的日期,还要确认叶子证书之后是否包含正确的中间证书。
可以继续提取常用字段:
openssl s_client \
-connect www.example.com:443 \
-servername www.example.com </dev/null 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates -ext subjectAltName
如果 subjectAltName 中没有当前访问域名,即使证书尚未过期,客户端仍会判定域名不匹配。
第二步:检查证书链是否完整
服务器通常需要发送叶子证书和中间证书,不应把根证书作为普通链路证书依赖客户端接收。若只配置了站点证书而没有中间证书,一些桌面浏览器可能因为缓存或自动补链而正常,证书库较旧的设备、Java 程序或命令行客户端却可能失败。
常见修复方式是使用证书服务商提供的完整链文件。例如 Nginx 的 ssl_certificate 文件应先放站点证书,再按签发关系追加中间证书:
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
}
修改前备份原配置和证书文件,然后执行:
sudo nginx -t
sudo systemctl reload nginx
nginx -t 通过后再平滑重载。不要把私钥内容上传到在线检测工具,也不要在工单或聊天记录中粘贴私钥。
如果站点使用 CDN,需要分别确认两套证书链:访问者连接 CDN 边缘节点时收到的证书链,以及 CDN 通过 HTTPS 回源时源站返回的证书链。边缘证书正常,不代表源站证书也正常。
第三步:排查 SNI 和域名绑定
一台服务器或一个 CDN 节点可以承载多个 HTTPS 域名。客户端在 TLS 握手时通过 SNI 告诉服务器要访问哪个域名,服务器据此选择证书。域名没有绑定到正确的虚拟主机、CDN 配置未部署完成,或程序直接使用 IP 建立 HTTPS 连接时,都可能拿到默认证书。
对比带 SNI 和不带 SNI 的结果:
# 正常域名访问方式
openssl s_client -connect 203.0.113.10:443 \
-servername www.example.com </dev/null
# 模拟未发送 SNI 的旧客户端或异常程序
openssl s_client -connect 203.0.113.10:443 \
-noservername </dev/null
如果两次返回的证书不同,需要检查 Nginx/Apache 虚拟主机、CDN 加速域名与证书绑定、SAN 覆盖范围,以及健康检查或回源配置是否错误地使用 IP。
使用 IP 测试源站时,可以让 curl 仍携带正确的主机名和 SNI:
curl -Iv --resolve www.example.com:443:203.0.113.10 \
https://www.example.com/
这种方式比直接访问 https://203.0.113.10/ 更接近真实请求。
第四步:核对 TLS 版本和安全策略
部分旧系统不支持 TLS 1.3,甚至只能使用已经不建议启用的旧协议或旧密码套件。相反,一些新客户端会拒绝弱算法、过短密钥或不安全的签名方式。站点调整 CDN 安全策略后,故障经常集中出现在某一类设备。
可分别测试 TLS 1.2 和 TLS 1.3:
openssl s_client -connect www.example.com:443 \
-servername www.example.com -tls1_2 </dev/null
openssl s_client -connect www.example.com:443 \
-servername www.example.com -tls1_3 </dev/null
如果 TLS 1.2 失败而 TLS 1.3 正常,应检查 CDN 或服务器是否把最低版本设得过高。若业务必须支持旧终端,不要直接恢复已经淘汰的协议;先统计终端范围和安全影响,优先通过升级客户端、独立兼容域名或受限访问策略解决。
第五步:检查 DNS、IPv4/IPv6 和多节点配置
偶尔失败通常意味着访问路径不止一条。检查域名的 A、AAAA 和 CNAME 记录,并分别测试解析结果:
dig +short A www.example.com
dig +short AAAA www.example.com
dig +short CNAME www.example.com
curl -4Iv https://www.example.com/
curl -6Iv https://www.example.com/
如果 IPv4 正常、IPv6 失败,需要检查 AAAA 指向的服务是否部署了同一张证书和相同 TLS 配置。多源站或负载均衡场景还应逐个核对后端节点,避免只有部分节点使用了新证书。
CDN 配置变更后也要考虑传播时间。测试时记录实际连接 IP,并从不同网络复核,避免把单个节点的结果当成全网状态。
第六步:区分边缘握手失败和回源握手失败
访问者连不上 CDN 边缘节点时,通常会直接看到证书、协议或握手错误。访问者能完成 HTTPS 连接,但 CDN 无法与源站建立 TLS 时,前端更可能出现 502、503 或网关错误。
以 CloudFront 为例,如果回源使用 HTTPS,源站证书需要满足域名匹配、有效期、证书链和受信任 CA 等要求;源站返回的证书若与配置的 Origin Domain Name 或转发的 Host 不匹配,CloudFront 可能返回 502。
排查顺序应是:
- 从公网检查边缘域名证书;
- 使用正确的 SNI 和 Host 单独检查源站;
- 核对 CDN 回源域名、端口和协议;
- 检查源站日志是否收到请求;
- 修复后重新测试边缘和源站两条链路。
修复后如何验证
至少完成以下检查:
- OpenSSL 校验返回成功,服务端发送完整证书链;
- 主域名、
www和业务子域名都被 SAN 覆盖; - TLS 1.2/1.3 的支持范围符合业务预期;
- IPv4、IPv6 和主要 CDN 节点结果一致;
- 源站证书与 CDN 回源域名匹配;
- 失败设备或同版本模拟环境能够重新访问;
- 证书续期后,Web 服务和 CDN 配置会自动加载新证书。
证书排查最容易出现的误区,是看到自己的浏览器正常就认为部署完成。稳定的 HTTPS 需要域名、证书链、SNI、TLS 策略、DNS 路径和回源配置同时一致。把边缘和源站分开验证,再按设备与网络复测,通常能较快定位只有部分用户失败的原因。
参考资料
- AWS CloudFront Developer Guide: Requirements for using SSL/TLS certificates with CloudFront
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cnames-and-https-requirements.html - AWS CloudFront Developer Guide: HTTP 502 status code (Bad Gateway)
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/http-502-bad-gateway.html - OpenSSL Documentation:
openssl-s_client
https://docs.openssl.org/master/man1/openssl-s_client/ - curl Documentation: SSL certificate verification
https://curl.se/docs/sslcerts.html - NGINX Documentation: Configuring HTTPS servers
https://nginx.org/en/docs/http/configuring_https_servers.html - Lets Encrypt: Chain of Trust
https://letsencrypt.org/certificates/
资料核查日期:2026-09-16。




