HTTPS 证书报错如何排查?常见证书链、域名和过期问题怎么看?
简化版
HTTPS 证书报错要按域名、证书链、有效期、信任根、SNI、客户端时间和代理劫持逐项排查。常用工具是浏览器证书详情、openssl s_client、curl -v。常见问题包括证书过期、域名不匹配、漏配中间证书、SNI 配错、自签证书未被信任。
详细版
排查 HTTPS 证书问题时,先确认访问域名和证书 SAN 是否匹配,再看证书是否过期或未生效。然后检查服务端是否返回完整证书链,客户端是否信任根 CA,负载均衡或 CDN 是否用了正确证书。
常用命令:
openssl s_client -connect example.com:443 -servername example.com -showcerts
curl -v https://example.com/
-servername 很重要,它会带 SNI。没有 SNI 时,多域名服务器可能返回默认证书,导致误判。
完整版教学
一、TLS 证书验证在验证什么
浏览器访问 HTTPS 时,不只是协商加密,还要确认服务器身份。证书验证主要回答:这个证书是不是可信 CA 签发,证书里的域名是不是我要访问的域名,证书是否在有效期内。
trusted CA -> certificate chain valid
hostname matches SAN
now within notBefore/notAfter
任何一项失败,浏览器都应该报警。证书错误不是普通网络慢,而是身份无法确认。
二、域名不匹配怎么判断
现代证书主要看 SAN,也就是 Subject Alternative Name。访问 api.example.com 时,证书必须包含 api.example.com 或匹配的通配符。
valid: *.example.com matches api.example.com
invalid: *.example.com does not match a.b.example.com
通配符只匹配一层子域。很多线上故障来自证书覆盖了 www.example.com,但没有覆盖 api.example.com。
三、证书链不完整是什么
服务端通常要返回站点证书和中间证书,客户端本地信任根证书。如果服务端漏发中间证书,有些客户端可以自动补全,有些客户端会验证失败。
site cert -> intermediate CA -> root CA
server should send: site cert + intermediate
client has: root CA
这种问题在浏览器里可能正常,在 Java、老 Android、curl 里失败。排查时要看完整链,而不是只看第一张站点证书。
四、SNI 为什么重要
一台服务器或负载均衡可能托管多个 HTTPS 域名。客户端在 TLS ClientHello 里用 SNI 告诉服务器自己要访问哪个域名,服务器据此选择证书。
same IP:443
SNI=a.example.com -> cert A
SNI=b.example.com -> cert B
如果工具没有带 SNI,服务器可能返回默认证书,导致你以为证书错了。openssl s_client 排查时要加 -servername。
五、时间和有效期问题
证书有 notBefore 和 notAfter。客户端时间错误也会导致证书看起来未生效或已过期。
certificate valid: 2026-01-01 ~ 2026-12-31
client clock: 2025-12-01 -> not yet valid
client clock: 2027-01-01 -> expired
线上服务器、容器和客户端都要同步时间。NTP 异常不仅影响证书,也影响日志、签名和调度。
六、代理和企业根证书
有些公司代理、防病毒软件或抓包工具会安装本地根证书,对 HTTPS 做中间代理。浏览器看到的证书可能不是网站原始证书,而是代理临时签发的证书。
browser -> corporate proxy -> real site
browser sees cert issued by corporate CA
如果只有某台机器报证书异常,要检查本机根证书、代理配置、系统时间和安全软件,而不是只查服务端。
七、常用命令和排查顺序
可以先用 curl -v 看握手和错误,再用 openssl s_client 看证书链。排查顺序建议固定:域名、SNI、有效期、证书链、信任根、代理、本机时间。
| 排查项 | 工具 | 关注点 |
|---|---|---|
| 域名匹配 | 浏览器/openssl | SAN |
| 证书链 | openssl | intermediate |
| 过期 | openssl/curl | notAfter |
| SNI | openssl | -servername |
| 客户端信任 | 系统证书库 | root CA |
记忆钩子:证书排查先问“证书给谁、谁签的、现在能不能用、客户端信不信”。
八、常见误区与追问
- 误区:浏览器能打开就代表所有客户端都没问题。 不同客户端证书库和链补全能力不同。
- 误区:证书链只要有站点证书就够。 服务端通常还要返回中间证书。
- 误区:openssl 不带 SNI 也能准确验证多域名站点。 多域名 HTTPS 必须带
-servername。 - 追问:证书域名匹配看 CN 还是 SAN? 现代验证主要看 SAN。
- 追问:为什么只有部分用户报证书错? 可能是客户端时间、根证书、代理、老系统兼容或分地域 CDN 证书不同。
- 追问:证书刚换后仍报错怎么办? 检查负载均衡/CDN 节点是否全部更新,是否缓存旧证书。
- 追问:自签证书能不能用? 内网可用,但客户端必须安全分发并信任对应 CA。
九、加强记忆
HTTPS 证书问题不要只盯“过期”。完整排查链路是:访问的域名是否在 SAN 中,SNI 是否拿到了正确证书,证书链是否完整,时间是否在有效期内,客户端是否信任根 CA,链路中是否有代理替换证书。把这些固定成 checklist,排查证书错误就不会乱。