域名不匹配怎么排查
域名不匹配时浏览器报 NET::ERR_CERT_COMMON_NAME_INVALID,命令行工具会给出 hostname mismatch(校验错误码 62)。原因通常是三类:证书 SAN 里没有访问用的域名、客户端没有发送 SNI 而命中默认站点证书、或者访问路径经过了会改写域名或回源配置的中间设备。
基本信息
| 校验依据 | 现代客户端只检查 SAN,CN 一般不再参与域名匹配 |
|---|---|
| 常见原因 | 证书漏签域名、CDN 回源取错证书、用 IP 直连未发 SNI |
| 离线核对 | openssl verify -verify_hostname 或 s_client -verify_hostname |
| 通配符规则 | 通配符只匹配一级子域,且不匹配裸域名 |
| 相关错误码 | 62(hostname mismatch)、20(链不完整)、10(已过期) |
| 排查顺序 | 先看访问的是哪个域名与 SNI,再核对证书 SAN |
典型使用场景
- 新域名上线:确认证书 SAN 覆盖了全部对外域名
- 纯 IP 访问:明确此时不会发送 SNI,会命中默认站点
- CDN 与网关:核对回源配置与边缘节点证书
- 子域与通配符:确认匹配范围是否符合预期
- 多域名证书:逐条比对 SAN 列表而不是只看第一个
核对 SAN 与校验结果
核对 SAN 与校验结果
# 抓取线上证书并列出全部域名
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -subject -ext subjectAltName
# 离线校验指定域名是否匹配
openssl verify -CAfile ca.pem -verify_hostname www.example.com cert.pem
# 用 curl 输出校验结果(0 表示通过)
curl -s -o /dev/null -w 'verify=%{ssl_verify_result}\n' https://www.example.com
# 用 IP 直连对比:不带 SNI 会拿到默认站点证书
openssl s_client -connect 203.0.113.10:443 </dev/null 2>/dev/null | openssl x509 -noout -subject现象与原因
| 现象 | 可能原因 | 处置 |
|---|---|---|
| 全部客户端报不匹配 | 证书 SAN 未包含该域名 | 重新签发覆盖所需域名的证书 |
| 浏览器正常但 App 报错 | App 未发送 SNI 或使用 IP 直连 | 改用域名访问或在代码中正确设置 SNI |
| 部分区域用户报错 | CDN 节点证书未同步或回源取错 | 核对边缘节点与回源证书配置 |
| 子域报不匹配 | 通配符不覆盖该层级 | 为该子域单独写入 SAN |
| 换了域名后偶发失败 | 存在缓存或中间层改写 Host | 检查网关、代理与缓存策略 |
同一张证书包含多个 SAN 时,任意一个名称匹配即通过。排错时要逐条比对完整列表,尤其是通配符与具体域名的组合;只看第一条容易得出错误结论。
证书校验失败有明确的错误码区分:62 是域名不匹配,20 是链不完整,10 是已过期。先按错误码归类,再决定是补签域名、补中间证书还是续期,能显著缩短排查时间。