Appearance
SSL/TLS 信任链如何构建与验证?
客户端收到网站证书后,会寻找一条通向已信任 CA 的认证路径,再检查这条路径及目标域名是否满足要求。日常所说的“组建信任链”,包含服务器提供链材料、客户端构建路径、客户端验证路径三个环节。
各类证书的定义见公钥、私钥与数字证书。
1. 先理解签发关系
常见签发关系如下,箭头表示上级 CA 对下级证书签名:
中间层可以有多级。服务器发送的列表提供候选材料,客户端还会结合自身信任库、缓存和路径构建策略,选择可用路径。
跟着证书链走一遍验证过程
从服务器发送证书开始,逐步观察客户端如何寻找签发者、连接信任根并验证签名关系。打开交互演示 ↗
2. 服务器提供什么?
通常按以下顺序配置并发送:
- 站点证书。
- 直接签发该站点证书的中间 CA 证书。
- 沿目标路径继续向上的中间证书,包括该路径需要的交叉证书。
通常省略作为最终信任锚的自签名根证书;信任锚由客户端通过信任库和策略预先配置。
服务器私钥保存在服务器或密码设备中,供握手认证使用。发给客户端的是公开证书链。
交叉证书为什么会改变路径?
同一个 CA 的主体公钥可以出现在不同签发者签发的证书里。例如某 CA 既有自签名根版本,又有由另一根签发的交叉证书版本。后者在选定路径中承担连接到另一信任锚的角色。
选择链时,核对具体证书的签发者、签名和目标客户端。具体兼容路径见交叉证书链选择指南。
3. 客户端如何构建路径?
- 取站点证书中的 Issuer、Authority Key Identifier 等信息寻找候选签发者。
- 从服务器发来的中间链、本地缓存或其他允许的来源取得候选 CA 证书。
- 沿签发关系继续查找上级,尝试连接到客户端已接受的信任锚。
- 遇到多个候选路径时,按实现及策略选择可通过验证的路径。
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 与监听器绑定 |
| 更新后仍返回旧证书 | 检查证书引用和加载,见更新未生效排查 |
| 路径通过但业务握手失败 | 继续检查协议、签名方案、客户端认证要求和应用日志 |
