如何验证 HTTPS 证书的信任链?

描述 HTTPS 客户端如何通过多步骤验证服务器提供的证书链是否完整和有效。

前端安全 困难 安全 HTTPS SSL/TLS

证书信任链是指从终端证书(例如服务器证书)到中间证书再到根证书的一系列证书链,验证过程旨在确保证书真实未被篡改且可信,从而建立安全连接(如 HTTPS)。验证通常在客户端(如浏览器)进行,包含以下关键步骤:

  1. 接收和整理证书链
    当客户端连接服务器时,服务器发送包含服务器证书的链文件,可能包括中间证书。缺少中间证书或证书顺序错误会导致验证失败(“证书链不完整”)。

  2. 验证证书链完整性
    客户端逐一检查链中每个证书是否由可信上级证书颁发(如根 CA 信任下级,中间 CA 签发终端证书)。递归解析直到找到根证书,信任链必须是:终端 → 中间(如有) → 根证书。

  3. 验证数字签名
    客户端使用每个上级 CA 的公钥验证下 cert 的签名:
    • 检查证书内容的哈希值是否与使用公钥解密的签名匹配,确保未被篡改。
    • 例如:首先使用中间 CA 的公钥验证服务器证书的签名;再用根 CA 的公钥验证中间证书的签名。
    • 这一步确认信任传递:如果根 CA 受信任且所有签名有效,终端证书被验证。
  4. 检查证书有效期
    客户端验证当前时间是否在证书的颁发日期和过期日期范围内,过期或无效期证书会导致验证失败。

  5. 检查吊销状态
    客户端通过查询证书吊销列表(CRL)或在线证书状态协议(OCSP) 检查证书是否被吊销。支持 OCSP Stapling 技术可提高响应速度。

  6. 检查域名匹配
    客户端验证证书中的公共名(Common Name, CN)或主体备选名称(Subject Alternative Name, SAN)是否与访问的域名或 IP 地址匹配。

  7. 检查其他扩展字段
    客户端确保证书扩展字段(如密钥用法)符合预期,例如服务器证书仅用于服务器认证而非 code 签名。

  8. 最终信任锚点确认
    所有证书都必须链接到一个在客户端本地信任存储(如浏览器或 OS 库)中的根证书。客户端匹配根证书的公钥/私钥,并将它作为信任起点。整个链条验证失败若任一步骤出现问题。

示例简化流程:

  • 客户端接收证书链:[服务器证书] [中间证书A] [中间证书B]
  • 验证顺序:
    1. 服务器证书:由中间证书公钥验证
    2. 中间证书:由下级或根证书公钥递归验证
    3. 根证书:在预装信任存储中匹配
  • 成功返回绿灯,失败显示告警。