第一步:客户端向服务端发起请求
a. 客户端生成随机数R1 发送给服务端
b. 告诉服务端自己支持哪些加密算法和哈希算法
第二步:服务器向客户端发送数字证书
a. 服务端生成随机数R2
b. 从客户端支持的加密算法中选择一种双方都支持的加密算法(此算法用于后面的会话密钥生成)和哈希算法用机构的证书公钥解密得到证书的内容和证书签名
c. 服务端生成把证书、随机数R2、会话密钥生成算法,一同发给客户端
第三步:客户端验证数字证书。
这一部分是浏览器内置的 TSL 完成的:
a. 首先浏览器会从内置的证书列表中索引,找到服务器下发证书对应的机构,如果没有找到,此时就会提示用户该证书是不是由权威机构颁发,是不可信任的。如果查到了对应的机构,则取出该机构颁发的公钥、会话密钥生成算法、随机数R2。
b. 用机构的证书公钥解密得到证书的内容和证书签名,内容包括网站的网址、网站的公钥、证书的有效期等。浏览器会先验证证书签名的合法性。签名通过后,浏览器验证证书记录的网址是否和当前网址是一致的,不一致会提示用户。如果网址一致会检查证书有效期,证书过期了也会提示用户。这些都通过认证时,浏览器就可以安全使用证书中的网站公钥了。
c. 浏览器生成一个随机数 R3,根据会话密钥算法使用R1、R2、R3生成会话密钥。
d. 用服务端证书的公钥加密随机数R3并发送给服务端。
注意:以上其实就是 HTTPS 的握手过程,这个过程主要是认证服务端证书(内置的公钥)的合法性。因为非对称加密计算量较大,整个通信过程只会用到一次非对称加密算法(主要是用来保护传输客户端生成的用于对称加密的随机数私钥)。后续内容的加解密都是通过一开始约定好的对称加密算法进行的。
第四步:服务器得到会话密钥
a. 服务器用私钥解密客户端发过来的随机数R3
b. 根据会话密钥算法使用R1、R2、R3生成会话密钥
第五步:客户端与服务端进行加密会话
1) 客户端发送加密数据给服务端
发送加密数据:客户端加密数据后发送给服务端。
2)服务端响应客户端
解密接收数据:服务端用会话密钥解密客户端发送的数据
加密响应数据:用会话密钥把响应的数据加密发送给客户端。
3)客户端解密服务端响应的数据
解密数据:客户端用会话密钥解密响应数据