之前我错误认为,证书中的公钥信息用于验证服务器身份。殊不知公钥仅仅是用来加密,无法提供任何身份信息。经过一些调研,我将了解的信息记录如下:
在 TLS 握手过程中,服务器向客户端发送自己的证书。证书中包含服务器的签名和签名算法。这个签名提供了身份信息。同时,证书中包含的签名是使用签发该证书的 CA 的私钥加密的。签名算法可以是 MD5 或者 SHA256。
客户端收到证书后,遵循以下步骤验证签名:
- 使用该签名算法对证书的内容(不包含签名)进行哈希运算,获得一个签名值。
- 使用 CA 的公钥对该加密的签名进行解密,获得签名。
- 比对这两个签名。如果一致,则服务器身份验证通过。