SAN (Subject Alternative Name,主体备用名称)
定义
SAN 即主体备用名称,是 X.509 证书中列出其适用的所有域名、IP 地址等身份的扩展,客户端按它校验主机名。
SAN(Subject Alternative Name,主体备用名称)扩展在 RFC 5280 中定义,内容是一组带类型的名称:dNSName 表示域名,iPAddress 表示 IPv4/IPv6 地址,rfc822Name 表示邮箱地址(S/MIME 使用),uniformResourceIdentifier 表示 URI。TLS 客户端把连接时使用的主机名与其中的 DNS 或 IP 条目比对,已不再参考 CN。一张证书可以包含很多个 SAN 条目,这正是 多域名证书 的实现基础。
为什么重要
名字不在 SAN 里,证书对它就无效。通配符 条目如 *.example.com 只匹配一级子域名:能匹配 www.example.com,但不匹配 example.com,也不匹配 a.b.example.com。所以多数证书会同时写上 example.com 和 www.example.com(或 *.example.com)。每个 SAN 条目都要经过 CA 验证,签发后列表就固定了,想增加域名只能重新签发。国内云厂商控制台里的“绑定域名”“多域名”选项,最终对应的都是 SAN 条目。
例子
生成私钥和带两个 SAN 条目的 CSR:
openssl req -new -newkey rsa:2048 -nodes -keyout example.com.key -out example.com.csr \
-subj "/CN=example.com" \
-addext "subjectAltName=DNS:example.com,DNS:www.example.com"
-addext 参数需要 OpenSSL 1.1.1 及以上版本。
常见误区
*.example.com也覆盖example.com。 不覆盖,主域名需要单独写一个条目。- 可以往现有证书里追加 SAN。 任何改动都会让 CA 的签名失效,只能重新申请证书。
- “SAN 证书”是一种特殊产品。 几乎所有 TLS 证书都有 SAN 扩展,这个营销说法只是指包含多个域名的证书。