如何验证 HTTPS 证书的信任链?
描述 HTTPS 客户端如何通过多步骤验证服务器提供的证书链是否完整和有效。
证书信任链是指从终端证书(例如服务器证书)到中间证书再到根证书的一系列证书链,验证过程旨在确保证书真实未被篡改且可信,从而建立安全连接(如 HTTPS)。验证通常在客户端(如浏览器)进行,包含以下关键步骤:
-
接收和整理证书链:
当客户端连接服务器时,服务器发送包含服务器证书的链文件,可能包括中间证书。缺少中间证书或证书顺序错误会导致验证失败(“证书链不完整”)。 -
验证证书链完整性:
客户端逐一检查链中每个证书是否由可信上级证书颁发(如根 CA 信任下级,中间 CA 签发终端证书)。递归解析直到找到根证书,信任链必须是:终端 → 中间(如有) → 根证书。 - 验证数字签名:
客户端使用每个上级 CA 的公钥验证下 cert 的签名:- 检查证书内容的哈希值是否与使用公钥解密的签名匹配,确保未被篡改。
- 例如:首先使用中间 CA 的公钥验证服务器证书的签名;再用根 CA 的公钥验证中间证书的签名。
- 这一步确认信任传递:如果根 CA 受信任且所有签名有效,终端证书被验证。
-
检查证书有效期:
客户端验证当前时间是否在证书的颁发日期和过期日期范围内,过期或无效期证书会导致验证失败。 -
检查吊销状态:
客户端通过查询证书吊销列表(CRL)或在线证书状态协议(OCSP) 检查证书是否被吊销。支持 OCSP Stapling 技术可提高响应速度。 -
检查域名匹配:
客户端验证证书中的公共名(Common Name, CN)或主体备选名称(Subject Alternative Name, SAN)是否与访问的域名或 IP 地址匹配。 -
检查其他扩展字段:
客户端确保证书扩展字段(如密钥用法)符合预期,例如服务器证书仅用于服务器认证而非 code 签名。 - 最终信任锚点确认:
所有证书都必须链接到一个在客户端本地信任存储(如浏览器或 OS 库)中的根证书。客户端匹配根证书的公钥/私钥,并将它作为信任起点。整个链条验证失败若任一步骤出现问题。
示例简化流程:
- 客户端接收证书链:[服务器证书] [中间证书A] [中间证书B]
- 验证顺序:
- 服务器证书:由中间证书公钥验证
- 中间证书:由下级或根证书公钥递归验证
- 根证书:在预装信任存储中匹配
- 成功返回绿灯,失败显示告警。