扩展决定用途边界
X.509 扩展字段决定一张证书能用来做什么:basicConstraints 标识它是不是 CA 以及可允许的路径长度,KeyUsage 限定密钥允许执行的操作,extendedKeyUsage 限定业务场景,subjectAltName 承载域名与 IP,AIA 提供补链与 OCSP 地址,CRLDP 指向吊销列表。排查证书问题时,这些扩展往往比主体名称更有决定意义。
基本信息
| basicConstraints | 是否 CA 及路径长度,叶证书一般是 CA:FALSE |
|---|---|
| keyUsage | 密钥可执行的操作,常见 digitalSignature、keyEncipherment |
| extendedKeyUsage | 业务场景,serverAuth、clientAuth、codeSigning |
| subjectAltName | 绑定域名与 IP,HTTPS 校验以它为准 |
| authorityInfoAccess | 补链与 OCSP 地址 |
| crlDistributionPoints | CRL 下载地址 |
常用扩展速查
| 扩展 | 含义 | 典型值 |
|---|---|---|
| basicConstraints | 是否 CA 及路径长度 | CA:FALSE / CA:TRUE,pathlen:0 |
| keyUsage | 密钥可执行的操作 | digitalSignature, keyEncipherment |
| extendedKeyUsage | 业务场景 | serverAuth / clientAuth / codeSigning |
| subjectAltName | 绑定域名与 IP | DNS:example.com, IP:203.0.113.10 |
| authorityInfoAccess | 补链与 OCSP 地址 | caIssuers / OCSP URI |
| crlDistributionPoints | CRL 下载地址 | http://crl.example.com/a.crl |
典型使用场景
- 排查证书用途报错:确认 EKU 中是否包含 serverAuth
- 自建 CA 签发下级证书:确认 CA:TRUE 与 keyUsage 里的 keyCertSign
- 域名不匹配问题:核对 SAN 列表而不是只看 CN
- 检查链与吊销配置:AIA 与 CRLDP 地址是否可达
- 上线前评审:把关键扩展纳入固定的检查清单
叶证书常见组合
| 用途 | 必需扩展组合 | 缺失后果 |
|---|---|---|
| HTTPS 服务端 | serverAuth 与 SAN 域名 | 缺少 SAN 时报名称不匹配 |
| 双向认证客户端 | clientAuth | 服务端拒绝该客户端证书 |
| 代码签名 | codeSigning | 签名工具或系统拒绝使用 |
| 内部 CA | CA:TRUE 与 keyCertSign | 部分实现拒绝用它签发的下级证书 |
常见误配
- 叶证书只写 CN 不写 SAN:主流浏览器只认 SAN,CN 仅作参考
- 把 codeSigning 证书部署为 HTTPS 服务端证书,严格客户端直接拒绝
- 中间 CA 缺 keyCertSign:签发下一级就会失败,报错信息还不直观
- 内部 CA 未设置 pathlen:信任链层级失控,暴露面随之扩大
- 忘记配置 AIA 与 CRLDP:吊销检查无处可查,只能靠短期证书兜底
过滤查看关键扩展
过滤查看关键扩展
# 一次只列出关键扩展,输出比整份 text 短得多
openssl x509 -in cert.pem -noout -text | grep -A3 -E 'Basic Constraints|Key Usage|Extended Key Usage|Subject Alternative Name'
# 单独查看 SAN 与 EKU(部分版本支持 -ext 参数)
openssl x509 -in cert.pem -noout -ext subjectAltName
openssl x509 -in cert.pem -noout -ext extendedKeyUsage扩展组合决定证书能否用于特定场景:缺少 serverAuth 的证书在部分客户端上会被拒绝用于 HTTPS。
关于 keyEncipherment 的取舍:TLS 1.3 大量使用临时密钥,该扩展已非必需,但保留它对老客户端兼容性更友好。
pathlen 设置不要放宽:中间 CA 若被允许继续签 CA,信任链的暴露面会成倍扩大,除非确有分层需要否则保持最小权限。