SAN 是什么
SAN(subjectAltName)是证书里用来列名称的扩展,支持在同一张证书中放置多个域名与多个 IP 地址。现代客户端只按 SAN 做主机名校验,通用的名称字段早已不再作为匹配依据,因此用 IP 直连访问的站点必须把 IP 放进 IP 类型条目,否则校验一定失败。名称数量同时受 CA 策略、证书体积与轮换复杂度约束。
基本信息
| 语法 | DNS:example.com, DNS:api.example.com, IP:203.0.113.10 |
|---|---|
| 校验依据 | 主机名匹配以 SAN 为准,通用名不再参与 |
| IP 访问 | 必须放入 IP 类型条目,写在域名类型里无效 |
| 查看命令 | openssl x509 -noout -ext subjectAltName |
典型使用场景
- 一张证书覆盖主域与若干子域,减少证书数量
- 内网设备用 IP 直连时把内网 IP 写入 SAN
- 多品牌或多业务域名需要统一证书时的规划
- 排错:确认证书是否真的覆盖当前访问的名称
- 评估轮换影响:名称越多,牵涉的依赖方越多
生成多域名 CSR 含 IP
生成多域名 CSR 含 IP
openssl req -new -key multi.key -out multi.csr -subj '/CN=example.com' \
-addext 'subjectAltName=DNS:example.com,DNS:api.example.com,IP:203.0.113.10'
openssl req -in multi.csr -noout -text | grep -A2 'Alternative Name' # 核对 CSR 内容
openssl x509 -in multi.crt -noout -ext subjectAltName # 核对签发结果常见名称类型
| 类型 | 写法 | 匹配对象 |
|---|---|---|
| 域名 | DNS:example.com | 主机名,含通配符形式 |
| 地址 | IP:203.0.113.10 | IPv4 与 IPv6 地址 |
| 邮箱 | email:ops@example.com | 邮件地址认证场景 |
| 标识 | URI:https://example.com | 服务标识场景,通用证书少见 |
通配符形式的名称只匹配同一级子域,裸域不会自动包含;需要同时覆盖主域时必须在 SAN 里单独列出。
落地建议
- 签发前先列全需要覆盖的名称,避免上线后补签
- 内网 IP 变更即需重签,规划时尽量减少 IP 条目
- 名称增多会放大私钥泄露影响面,应配套缩短轮换周期
- 定期把证书覆盖范围与业务域名清单做比对
把大量互不相关的业务域名塞进同一张证书,会让单点泄露影响全部站点,也会让续期与部署变更集中在一处;按业务边界拆分更稳妥。