证书链是什么
证书链描述的是客户端如何一步步信任一张服务器证书:服务器证书(叶)由中间 CA 签发,中间 CA 由根 CA 签发,而根 CA 预置在操作系统或浏览器的信任库里。客户端从服务端发来的证书出发,逐级用签发者公钥验证签名、有效期与用途扩展,直到命中本地信任锚。服务端的责任是在握手中提供完整的中间证书,只发叶证书会让一部分客户端补链失败。
基本信息
| 层级 | 根(自签,内置信任库)→ 中间(可多级)→ 服务器(叶) |
|---|---|
| TLS 中的顺序 | 叶证书在前,其后每张证书直接签发前一张(RFC 8446 §4.4.2) |
| 验证要点 | 签名、有效期、用途扩展、吊销状态、名称约束 |
| 验证命令 | openssl verify -CAfile root.pem -untrusted intermediate.pem leaf.pem |
| 典型报错 | unable to get local issuer certificate 表示中间证书缺失 |
逐级确认签发关系
逐级确认签发关系
# 列出链里每张证书的主体与签发者,确认是逐级签发
openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout
# 用根证书与中间证书独立验证叶证书
openssl verify -CAfile root.pem -untrusted intermediate.pem leaf.pem
# 查看服务端实际下发的链与顺序
openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null验证失败提示速查
| 提示 | 含义 | 处置 |
|---|---|---|
| unable to get local issuer certificate | 中间证书缺失或不匹配 | 服务端补全中间证书链 |
| self-signed certificate in certificate chain | 链里混入自签证书 | 换用公开 CA 签发的完整链 |
| certificate has expired | 链上存在过期证书 | 定位是哪一张并续期 |
| hostname mismatch | 证书名称与实际域名不符 | 检查 SAN 列表与 SNI 配置 |
验证是按信任锚倒推:只要存在一条能走到信任根的路径即可通过;链越长并不代表越安全,还会增加握手体积。
关于 AIA 补链:部分桌面浏览器会按证书里的 AIA 地址下载缺失的中间证书,但移动端、嵌入式设备与部分语言实现不做这一步,所以把中间证书备齐的责任始终在服务端。
链顺序错误的后果因实现而异:严格实现直接失败,宽松实现会自行排序,因此本地测试通过不等于所有客户端都能连上,上线前最好用多类客户端各验一次。