HTTPS 证书的 SAN 和通配符域名是什么?浏览器如何做域名匹配?
简化版
HTTPS 证书不仅要被可信 CA 签发,还要和访问的域名匹配。现代证书主要通过 Subject Alternative Name,简称 SAN,声明可用于哪些域名。
通配符证书如 *.example.com 通常只能匹配一级子域名,例如 a.example.com,不能匹配 a.b.example.com,也不能直接匹配根域 example.com,除非证书里单独包含这个 SAN。
面试回答要说清 3 点:信任链验证、有效期验证、域名匹配验证。
详细版
浏览器访问:
https://api.example.com
服务端返回证书后,浏览器会检查:
- 证书链是否能追溯到受信任根 CA。
- 证书是否在有效期内。
- 证书是否被吊销。
- 证书用途是否允许服务端认证。
- 访问域名是否出现在 SAN 中。
示例 SAN:
DNS:example.com
DNS:*.example.com
DNS:api.internal.example.com
如果访问 api.example.com,*.example.com 可以匹配;如果访问 example.com,必须有 example.com;如果访问 v1.api.example.com,*.example.com 通常不能匹配。
完整版教学
1. 先把证书验证拆成几层
HTTPS 证书验证不是只看“证书是不是 CA 签的”。
浏览器会做一组检查。
证书链可信 -> 有效期合法 -> 用途正确 -> 域名匹配 -> 吊销状态可接受
其中域名匹配就是题目里 SAN 和通配符最常考的点。
域名匹配解决的是:这张证书是不是颁给我正在访问的这个主机名。
2. SAN 是现代证书的主角
早期证书里常用 Common Name,简称 CN,表示域名。
现代浏览器和 CA 生态更强调 SAN。
证书里可能有:
Subject: CN=example.com
Subject Alternative Name:
DNS:example.com
DNS:www.example.com
DNS:api.example.com
浏览器做主机名校验时,主要看 SAN 中的 DNS 名称。
如果 SAN 不包含访问域名,即使 CN 看起来相似,也可能被判定不可信。
3. 通配符证书怎么匹配
通配符证书常见形式是:
DNS:*.example.com
它通常可以匹配:
www.example.comapi.example.comimg.example.com
但通常不能匹配:
example.comv1.api.example.coma.b.example.com
因为 * 一般只覆盖一个标签层级。
根域需要单独写进 SAN。
4. SAN 匹配示例表
| 证书 SAN | 访问域名 | 是否匹配 | 原因 |
|---|---|---|---|
example.com | example.com | 是 | 完全匹配 |
*.example.com | api.example.com | 是 | 通配一级子域名 |
*.example.com | example.com | 否 | 根域不被星号覆盖 |
*.example.com | v1.api.example.com | 否 | 跨了 2 级 |
api.example.com | www.example.com | 否 | 主机名不同 |
这个表在面试里很好用,因为很多人会误以为通配符能覆盖所有层级。
5. 多域名证书和 SNI 的关系
一个证书可以有多个 SAN,因此可以保护多个域名。
例如:
DNS:example.com
DNS:www.example.com
DNS:api.example.net
但同一台服务器托管多个 HTTPS 域名时,服务端还要知道客户端要访问哪个域名,才能返回正确证书。
这通常依赖 TLS SNI。
SAN 解决“证书包含哪些名字”,SNI 解决“握手时服务端该选哪张证书”。
6. 线上常见错误
常见 HTTPS 证书域名问题包括:
- 证书只包含
www.example.com,用户访问example.com报错。 - 证书是
*.example.com,但业务访问a.b.example.com报错。 - CDN 回源域名和源站证书域名不一致。
- 测试环境使用生产域名证书但 Host 不匹配。
- 证书更新后负载均衡仍加载旧证书。
排查时可以用浏览器证书详情或命令行查看 SAN。
openssl s_client -connect api.example.com:443 -servername api.example.com
7. 常见误区与追问
- 误区:证书由 CA 签发就一定可用。 还必须和访问域名匹配,并满足有效期和用途等要求。
- 误区:通配符证书能匹配任意层级子域名。 通常只匹配一级子域名。
- 误区:有 CN 就不用 SAN。 现代浏览器主要看 SAN,不能依赖 CN 兜底。
- 追问:为什么根域要单独写进 SAN?
*.example.com不覆盖example.com本身。 - 追问:SAN 和 SNI 有什么区别? SAN 是证书里的名字列表,SNI 是客户端握手时告诉服务端要访问哪个名字。
- 追问:CDN 证书不匹配怎么排查? 看客户端访问域名、CDN 边缘证书、回源 Host 和源站证书是否一致。
8. 加强记忆
证书域名匹配记成一句链路:访问谁,SNI 报谁,证书 SAN 里必须有谁。
通配符只管一级,根域另写,深层子域另配。