一图胜千言, 仅限于Https(TLS 1.2):

  1. 客户端告知服务端自己支持的密码套件(比如 TLS_RSA_WITH_AES_256_GCM_SHA384,其中 RSA 是密钥交换的方式, AES_256_GCM 是加密算法,SHA384 是消息验证摘要算法),提供客户端随机数。

  2. 服务端应答选择的密码套件,提供服务端随机数。

  3. 服务端发送 CA 证书给客户端,客户端验证 CA 证书(后面详细说明)。

  4. 客户端生成 PreMasterKey,并使用非对称加密 + 公钥加密 PreMasterKey

  5. 客户端把加密后的 PreMasterKey 传给服务端。

  6. 服务端使用非对称加密 + 私钥解密得到 PreMasterKey,并使用 PreMasterKey+ 两个 随机数,生成 MasterKey

  7. 客户端也使用 PreMasterKey+ 两个随机数生成 MasterKey

  8. 客户端告知服务端之后将进行加密传输。

  9. 客户端使用 MasterKey 配合对称加密算法,进行对称加密测试。

  10. 服务端也使用 MasterKey 配合对称加密算法,进行对称加密测试。

客户端怎么验证 CA 证书?

CA 证书是一个证书链。

从服务端拿到的 CA 证书是用户证书,我们需要通过证书中的签发人信息找到上级中间证书,再往上找到根证书。

根证书只有为数不多的权威机构才能生成,一般预置在OS中,根本无法伪造。

找到根证书后,提取其公钥来验证中间证书的签名,判断其权威性。

最后再拿到中间证书的公钥,验证用户证书的签名。

怎么验证证书的签名?

数字签名的生成过程如下:

明文 –> hash运算 –> 摘要 –> 私钥加密 –> 数字签名

接收端验证流程:

数字签名 –> 公钥解密 –> 摘要1

密文(就是被上一级机构签名的证书) –> 公钥解密 –> 明文 –>hash –>摘要2

对比两个摘要,相同则ok。