DevKitLab Logo DevKitLab
SSL / TLS / SAN / SNI / 域名 / HTTPS

为什么 SSL 证书与域名不匹配?SAN、通配符与 SNI 排查

SSL 证书与域名不匹配,未必是证书申请错了:访问的名字、SAN、通配符层级、SNI、DNS、CDN 和负载均衡都可能让客户端拿到另一张证书。本文给出从浏览器错误到实际 TLS 入口的排查方法。

浏览器提示证书不匹配,最常见的误会是「这张证书肯定申请错了」。有时确实如此,但更多时候证书本身没有问题:用户访问的是另一个名字,服务器因为缺少 SNI 送出了默认证书,或 DNS 把一部分流量带到了仍在使用旧证书的入口。

排查这类问题要同时回答两个问题:用户请求的到底是哪一个主机名?公网 TLS 端点实际回了哪一张证书?把这两件事拆开,NET::ERR_CERT_COMMON_NAME_INVALID 之类的错误就不再神秘。

先用 SSL 证书检测工具对公网域名做握手检查。它能显示主机名是否匹配、服务端返回的链,以及解析到的地址;随后用 证书解码工具读出证书里的 SAN 列表。

域名覆盖看 SAN,不看文件名或 Common Name

现代客户端以 Subject Alternative Name(SAN)扩展判断证书覆盖哪些名字。Common Name 仍可能显示在证书中,但它不应作为域名覆盖的依据;文件名、订单名称和控制台里的备注当然更不能说明问题。

拿到公网返回的叶子证书后,逐项比较 DNS SAN 与用户地址栏里的完整主机名。不要只确认「公司主域名大概在里面」,要确认字面上请求的那个名字确实被覆盖。

请求的地址需要的覆盖常见误解
example.comexample.com 这个 DNS SAN*.example.com 会覆盖根域名
www.example.comwww.example.com 或匹配它的通配符根域名证书自动覆盖 www
api.example.comapi.example.com*.example.com任意多层通配符都通用
v2.api.example.com精确 SAN 或 *.api.example.com*.example.com 可以跨两层
https://203.0.113.10/对应的 IP SANDNS SAN 能覆盖 IP 访问

通配符只替代一层标签

*.example.com 可以覆盖 api.example.com,却不覆盖 example.com,也不覆盖 v2.api.example.com。星号只替代点号之间的一层标签,不是「这个域名下全部层级」的通行证。

因此,申请证书前应从真实入口清单出发:根域名、www、API、管理后台、地区子域名和监控使用的主机名分别列出来。把目前没上线但即将切流的名字也纳入续期和替换计划,避免迁移当天才发现 SAN 少了一项。

SNI 决定服务器先挑哪一张证书

一台 IP 可以承载很多 HTTPS 域名。TLS 握手早于 HTTP 请求,服务器此时还看不到完整的 URL 路径;客户端通过 SNI 告诉服务器「我要访问哪个主机名」,服务器据此选择对应的证书。

如果测试时只连 IP、监控没有携带 SNI,或代理把 SNI 改成了别的名字,服务端通常会返回默认站点的证书。那张证书可能完全有效,只是与用户本来想访问的域名不匹配。

在检测工具中使用真实的主机名,并在按 IP 测试时显式填写预期 SNI。对同一个 IP 分别带和不带目标 SNI 比较:返回证书不同,说明证书选择会随请求或节点变化;带上正确 SNI 仍返回错误证书,才应检查该虚拟主机、Ingress 或负载均衡规则。

DNS、CDN 和负载均衡可能把流量送到旧入口

即使 SAN 配置正确、SNI 也正确,用户仍可能连到另一台机器。迁移或换证书后最常见的是 IPv4 已更新、IPv6 仍指向旧服务,或者 CNAME 前面接入了 CDN、托管平台和多层负载均衡。

DNS 查询工具核对 A、AAAA、CNAME 和 TTL,并顺着 CNAME 看清实际入口。低 TTL 不能让所有递归缓存立即忘掉旧记录;它只限制缓存从收到结果开始还能保存多久。出现间歇错误时,要分别检查每个解析结果和每个后端节点。

证书在磁盘上正确,不代表公网在用它

很多排查停在「我服务器上的证书 SAN 没问题」。但真正对外终止 TLS 的可能是 CDN、云负载均衡、Kubernetes Ingress、反向代理,甚至一台忘记退出的旧服务器。后端机器的配置正确,只能证明后端正确。

应以公网握手返回的叶子证书序列号或 SHA-256 指纹为准,再沿着流量路径找到相同或不同的终止点。若某个入口仍送出旧证书,就在那个入口更新配置、重新加载,并从公网验证结果,而不是继续改应用服务器。

域名形式也会改变匹配结果

用户有时并没有访问你认为的标准地址:可能输入了裸 IP、旧域名、内部别名,或复制了带有拼写差异的主机名。IDN 域名在证书和 DNS 中通常以 Punycode 表示,排查时应比较实际握手使用的主机名,而不是只看界面显示。

证书匹配只解决「请求名称是否被证书覆盖」。如果证书正确、链也可信、却只有某个网络显示陌生证书,还要排除企业 HTTPS 检查、门户网络和安全软件在中间替换证书。

一套从错误到修复的排查顺序

  1. 记录浏览器或客户端提示的完整主机名与错误,不要只记「证书不匹配」。
  2. SSL 证书检测工具检查该公网主机名,并在需要时指定端口和 SNI。
  3. 证书解码工具查看公网叶子证书的 DNS SAN,逐项与请求主机名比较。
  4. 检查根域、www、通配符、多级子域和 IP 访问是否被正确覆盖。
  5. 对同一 IP 比较带与不带预期 SNI 的证书,再检查 CDN、负载均衡或 Ingress 的域名路由。
  6. DNS 查询工具检查 A、AAAA、CNAME 和所有可能的入口,确认没有旧节点继续送错证书。
  7. 修复实际 TLS 终止点后,从公网再次握手,并在 IPv4、IPv6 与原先失败的客户端上复测。

如果域名匹配已经通过、但客户端仍不信任链,就不要继续改 SAN。下一步应排查为什么证书链不完整;更完整的决策树见SSL 证书为什么无效