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

-
客户端告知服务端自己支持的密码套件(比如
TLS_RSA_WITH_AES_256_GCM_SHA384,其中RSA是密钥交换的方式,AES_256_GCM是加密算法,SHA384是消息验证摘要算法),提供客户端随机数。 -
服务端应答选择的密码套件,提供服务端随机数。
-
服务端发送 CA 证书给客户端,客户端验证 CA 证书(后面详细说明)。
-
客户端生成
PreMasterKey,并使用非对称加密 + 公钥加密PreMasterKey。 -
客户端把加密后的
PreMasterKey传给服务端。 -
服务端使用非对称加密 + 私钥解密得到
PreMasterKey,并使用 PreMasterKey+ 两个 随机数,生成MasterKey。 -
客户端也使用
PreMasterKey+ 两个随机数生成MasterKey。 -
客户端告知服务端之后将进行加密传输。
-
客户端使用
MasterKey配合对称加密算法,进行对称加密测试。 -
服务端也使用
MasterKey配合对称加密算法,进行对称加密测试。
客户端怎么验证 CA 证书?
CA 证书是一个证书链。
从服务端拿到的 CA 证书是用户证书,我们需要通过证书中的签发人信息找到上级中间证书,再往上找到根证书。
根证书只有为数不多的权威机构才能生成,一般预置在OS中,根本无法伪造。
找到根证书后,提取其公钥来验证中间证书的签名,判断其权威性。
最后再拿到中间证书的公钥,验证用户证书的签名。
怎么验证证书的签名?
数字签名的生成过程如下:
明文 –> hash运算 –> 摘要 –> 私钥加密 –> 数字签名
接收端验证流程:
数字签名 –> 公钥解密 –> 摘要1
密文(就是被上一级机构签名的证书) –> 公钥解密 –> 明文 –>hash –>摘要2
对比两个摘要,相同则ok。