客户端通过以下步骤检查中间CA的签名是否由受信任的根CA签发:
1. 证书链的构建
服务器发送的证书链通常包含:
• 服务器证书(由中间CA签发)
• 中间CA证书(由根CA签发)
• 根CA证书(通常不发送,预装在客户端中)
客户端需要从中间CA证书的颁发者(Issuer)信息,找到对应的根CA证书。
2. 验证签名
(1) 提取中间CA的签名信息
• 中间CA证书中包含一个数字签名,该签名是中间CA的公钥对证书内容(包括颁发者、有效期、域名等)的哈希值加密后的结果。
(2) 获取根CA的公钥
• 客户端从内置的根证书列表中查找与中间CA证书的“Issuer”字段匹配的根CA证书。
• 根CA证书是自签名的,其公钥直接存储在客户端中。
(3) 验证签名合法性
• 客户端使用根CA的公钥解密中间CA证书的签名,得到哈希值。
• 客户端对中间CA证书的内容(除签名外)重新计算哈希值,并与解密后的哈希值比对。
• 如果一致,说明中间CA证书确实由对应的根CA签发。
3. 信任链的传递
• 中间CA证书的“Issuer”必须与根CA证书的“Subject”完全匹配(包括国家、组织、通用名称等字段)。
• 根CA证书必须是客户端内置的受信任根证书(如Windows的根证书存储或浏览器内置列表)。
4. 示例流程(以Let’s Encrypt为例)
-
服务器发送证书链:
• 服务器证书(由中间CALet's Encrypt Authority X3
签发)• 中间CA证书(由根CA
ISRG Root X1
签发) -
客户端验证中间CA签名:
• 提取中间CA证书的“Issuer”字段:ISRG Root X1
。• 客户端查找内置根证书中是否存在
ISRG Root X1
。• 使用
ISRG Root X1
的公钥解密中间CA证书的签名,验证哈希值是否匹配。 -
信任链成立:
• 如果签名验证通过,且根CA受信任,则中间CA的合法性被确认。
5. 关键检查点
• 颁发者匹配:中间CA的“Issuer”必须对应某个根CA的“Subject”。
• 根CA受信任:根CA必须存在于客户端的预装信任列表中。
• 签名算法有效性:客户端需支持中间CA证书使用的签名算法(如RSA、ECDSA)。
6. 异常情况处理
• 中间CA未找到对应的根CA:客户端提示“此证书由不受信任的机构颁发”。
• 签名不匹配:客户端提示“证书签名无效”。
• 根CA未预装:用户需手动安装根CA证书(如企业内网场景)。
7. 技术补充
• 证书扩展验证:客户端还会检查中间CA证书的扩展字段(如 Basic Constraints
),确保证书类型允许签发子证书。
• 证书吊销状态:即使签名合法,若中间CA证书被吊销,客户端仍会终止连接(通过CRL或OCSP)。
总结:
客户端通过比对中间CA证书的“Issuer”与根CA的“Subject”,并用根CA的公钥验证签名,确保中间CA的合法性。这一过程是HTTPS信任链的核心,缺一不可。