Skip to content

SSL/TLS 信任链如何构建与验证? ​

客户端收到网站证书后,会寻找一条通向已信任 CA 的认证路径,再检查这条路径及目标域名是否满足要求。日常所说的“组建信任链”,包含服务器提供链材料、客户端构建路径、客户端验证路径三个环节。

各类证书的定义见公钥、私钥与数字证书。

1. 先理解签发关系 ​

常见签发关系如下,箭头表示上级 CA 对下级证书签名:

中间层可以有多级。服务器发送的列表提供候选材料,客户端还会结合自身信任库、缓存和路径构建策略,选择可用路径。

跟着证书链走一遍验证过程

从服务器发送证书开始,逐步观察客户端如何寻找签发者、连接信任根并验证签名关系。打开交互演示 ↗

2. 服务器提供什么? ​

通常按以下顺序配置并发送:

  1. 站点证书。
  2. 直接签发该站点证书的中间 CA 证书。
  3. 沿目标路径继续向上的中间证书,包括该路径需要的交叉证书。

通常省略作为最终信任锚的自签名根证书;信任锚由客户端通过信任库和策略预先配置。

服务器私钥保存在服务器或密码设备中,供握手认证使用。发给客户端的是公开证书链。

交叉证书为什么会改变路径? ​

同一个 CA 的主体公钥可以出现在不同签发者签发的证书里。例如某 CA 既有自签名根版本,又有由另一根签发的交叉证书版本。后者在选定路径中承担连接到另一信任锚的角色。

选择链时,核对具体证书的签发者、签名和目标客户端。具体兼容路径见交叉证书链选择指南。

3. 客户端如何构建路径? ​

  1. 取站点证书中的 Issuer、Authority Key Identifier 等信息寻找候选签发者。
  2. 从服务器发来的中间链、本地缓存或其他允许的来源取得候选 CA 证书。
  3. 沿签发关系继续查找上级,尝试连接到客户端已接受的信任锚。
  4. 遇到多个候选路径时,按实现及策略选择可通过验证的路径。

Issuer/Subject 名称与密钥标识有助于寻找候选,最终需要验证签名及约束。部分客户端能够通过 AIA 地址补取中间证书,其他客户端可能不支持或无法联网,因此服务器应主动提供适用中间链。

4. 找到路径后检查什么? ​

检查要回答的问题
签名每级证书是否可由对应上级公钥验证,内容是否完整?
CA 资格与路径约束中间证书是否具备 CA 能力,Key Usage、路径长度及名称约束是否允许这条路径?
有效期与算法路径中的证书是否处于可接受有效期,算法是否符合客户端策略?信任锚另受本地策略管理
站点用途叶证书的 KU/EKU 是否允许本次服务器认证用途?
服务身份实际访问域名或 IP 是否匹配叶证书 SAN 中相应类型的标识?
其他客户端策略按客户端能力与策略检查吊销状态、证书透明度、证书绑定等要求

这些检查由路径验证、应用身份校验及客户端策略共同完成。TLS 握手还需要服务器证明其持有与叶证书公钥匹配的私钥。

5. 可选:查看服务器实际发送的链 ​

需要检查实际站点或本地材料时,可执行以下命令。

在可访问目标服务、已安装 OpenSSL 的终端执行,将两处域名替换为目标域名:

sh
openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null

-showcerts 展示服务器实际发送的证书列表。记录叶证书与每级中间证书的 Subject/Issuer,并检查是否命中了预期站点。SNI 用于选择站点;域名校验需要另行启用。

要同时要求域名与信任校验,使用:

sh
openssl s_client -connect example.com:443 -servername example.com \
  -verify_hostname example.com -verify_return_error -showcerts </dev/null

确认握手成功、没有验证错误且返回 Verify return code: 0 (ok)。若环境未配置默认信任库,可通过 -CAfile 指定受控的 CA 集合。此结果反映当前 OpenSSL 的信任环境;浏览器、Java 和设备仍需各自验收。

6. 可选:用本地材料验证一条路径 ​

准备三类 PEM 文件:

  • server.pem:待验证的单张站点证书。
  • intermediates.pem:候选中间链,包含该路径需要的交叉证书。
  • trusted-roots.pem:从目标信任配置或可信管理渠道取得的信任锚集合。

下面示例使用 OpenSSL 3.x,只采用指定的 CA 文件作为信任来源:

sh
openssl verify -show_chain -purpose sslserver -verify_hostname example.com \
  -CAfile trusted-roots.pem -no-CApath -no-CAstore \
  -untrusted intermediates.pem server.pem

-untrusted 的含义是“用于构建路径的候选材料”,其可信性由通向信任锚的验证过程建立。成功时返回 server.pem: OK 并列出选中的路径。

该命令验证指定材料的路径、用途和域名。吊销状态需另行检查,线上验收还应使用目标浏览器或应用测试实际连接。

7. 按现象选择下一步 ​

现象下一步
找不到签发者、无法构建路径检查服务器是否缺中间证书、交叉链是否适用、目标信任库是否具有适用信任锚
浏览器成功,Java 或设备失败比较信任库、AIA 补链能力、算法限制与实际网络入口,见客户端差异排查
域名不匹配核对访问名称、SAN、SNI 与监听器绑定
更新后仍返回旧证书检查证书引用和加载,见更新未生效排查
路径通过但业务握手失败继续检查协议、签名方案、客户端认证要求和应用日志

参考资料 ​