首页/安全/加密与证书速查/证书链的组成与验证顺序

证书链的组成与验证顺序

一条链通常为根证书到中间证书再到服务器证书;客户端从服务端提供的链出发,逐级用签发者公钥验证签名,直到命中本地信任库中的根证书。

加密与证书速查安全更新于 2026-10-13

证书链是什么

证书链描述的是客户端如何一步步信任一张服务器证书:服务器证书(叶)由中间 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 地址下载缺失的中间证书,但移动端、嵌入式设备与部分语言实现不做这一步,所以把中间证书备齐的责任始终在服务端。
链顺序错误的后果因实现而异:严格实现直接失败,宽松实现会自行排序,因此本地测试通过不等于所有客户端都能连上,上线前最好用多类客户端各验一次。

易错点

  • 服务端只发叶证书不发中间证书,桌面浏览器可能靠 AIA 补链而移动端直接失败
  • 认为链顺序无关紧要:严格实现要求叶在前、逐级签发
  • 换 CA 时只更新叶证书不更新中间证书,造成新旧链混用与间歇性验证失败
  • 用 openssl verify 验证时漏掉 -untrusted,把中间证书缺失误判成根信任问题
  • 把根证书也塞进服务端下发的链,徒增握手体积且无必要

数据来源与参考

  • RFC 5280 §6(认证路径验证)
  • RFC 8446 §4.4.2(Certificate 消息)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌