证书链(Certificate Chain)是从终端 数字证书 经一个或多个中间 CA 证书,一路验证到本地可信根证书的证书序列。
核心问题
浏览器或操作系统通常只内置信任少量根 CA,不会直接认识每个网站证书的签发者。证书链让依赖方可以逐级验证:终端证书由中间 CA 签,中间 CA 又由更上级 CA 签,直到链条到达本地信任库里的根证书。
核心机制
常见 TLS 证书链形态是:
服务器证书 -> 中间 CA 证书 -> 根 CA 证书每一跳都要验证“下一级证书的签名是否能被上一级证书里的公钥验证”:
Verify(issuer_public_key, child_certificate.tbs, child_certificate.signature)其中 issuer_public_key 来自上级证书;child_certificate.tbs 是待签名证书内容;signature 是上级 CA 对它的签名。最后一张根证书通常是自签名证书,它是否可信不是靠继续向上验证,而是靠本地信任库预先信任。
验证还会检查 Basic Constraints、Key Usage、有效期、名称约束、路径长度和吊销状态。中间证书即使签名正确,如果没有 CA 权限,也不能拿来签发下级证书。
工程用途
- HTTPS 服务端需要发送服务器证书和中间证书。
- 企业 mTLS 需要让客户端和服务端都能构造完整信任链。
- 证书故障排查时定位缺失中间证书、过期中间证书或错误根信任。
- 内部 PKI 设计时用中间 CA 限制日常签发风险。
边界与常见坑
- 链完整不等于链可信:最后必须落到本地信任库里的可信根。
- 服务器通常不发送根证书:根证书来自客户端信任库,发送也不会让客户端自动信任。
- 缺失中间证书很常见:浏览器可能自动补全,嵌入式或 CLI 客户端可能直接失败。
- 名称匹配在终端证书上检查:中间 CA 的名字不是网站域名。
- 中间 CA 约束必须检查:忽略 path length 或 name constraints 会扩大签发权限。