链验证
证书不是孤立可信的,它必须挂在一条能追到信任根的链上。这一组能力验证链的完整性与可信度。
两条命令
| 命令 | 作用 |
|---|---|
verify-chain <domain> | 对照系统信任库验证证书链 |
check-bundle <domain> | 检查证书包完整性,缺失中间证书时走 AIA 补全 |
信任链验证
bash
cert-skills verify-chain example.com把服务器出示的叶子 + 中间证书一路追到根,逐级检查:
每一级都校验:签名有效、未过期、KeyUsage 合规(CA 须含 keyCertSign)、pathLenConstraint 不越界。
信任链的本质
链验证 = 逐级"签名追签"直到追到系统信任库里预置的根。每一级不光验签名,还验"这张 CA 有没有资格签这一级"——靠 KeyUsage(含 keyCertSign 才是 CA)和 pathLenConstraint(限制还能往下嵌套几层)约束。
Bundle 完整性
部署时最常见的错误:服务器只发叶子证书,忘了发中间证书,导致客户端找不到链路。
bash
cert-skills check-bundle example.comcheck-bundle 的关键能力:当发现中间证书缺失时,从叶子证书的 AIA(Authority Information Access) 扩展里读 caIssuers URL,主动去拉取中间证书再补验。这让诊断"为什么有的客户端报错有的不报错"变得可解释——不同客户端的信任库缓存不同,AIA 补全行为也不同。
AIA 补全不是万能的
AIA 拉取依赖叶子证书里写了 caIssuers URL,且该 URL 可达。有些证书没写 AIA 扩展,或 URL 已失效——这时 check-bundle 也补不了,必须手动补中间证书。生产部署的正确做法是服务器直接发完整链,不要依赖客户端 AIA 补全。
链拓扑
在测绘场景下,map-scan 会用链数据构建信任拓扑图:以每张证书为节点,issuer→subject 为边,自签自环,找出 Roots(无入边)和 Leaves(无出边)。详见 批量扫描与拓扑。
常见链问题速查
| 现象 | 可能原因 | 用哪个工具 |
|---|---|---|
| 浏览器报"证书不受信任" | 链不可信/根不在库 | verify-chain |
| 部分客户端 OK,部分报错 | 中间证书缺失 | check-bundle |
| 链可建但 pathLen 越界 | 中间 CA 的 pathLen 设错 | verify-chain + 多层 PKI |
| 链含被吊销 CA | 用了 DigiNotar 等 | check-distrusted-ca |
链问题速查决策图
按现象快速选工具:
- 浏览器报"不受信任" →
verify-chain(链不可信或根不在库) - 部分客户端 OK 部分报错 →
check-bundle(中间证书缺失) - 报"pathLen constraint violated" →
verify-chain+ 查中间 CA 的 pathLen - 怀疑用了被除名的 CA →
check-distrusted-ca(DigiNotar/WoSign/Symantec legacy...)
下一步
- 链验证的内部实现 → 批量扫描与拓扑
- pathLen 怎么约束 → 多层 PKI 与 pathLen