HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行握手,在握手过程中将确立双方加密传输数据的密码信息。
一、客户端与服务端协商加密方式
-
客户端发送Client Hello报文开始
SSL
通信,报文中包含客户端支持的SSL
版本、加密组件列表以及生成的随机数(这里记为A) -
服务端可进行
SSL
通信时以Server Hello报文作为应答,报文中包含支持的SSL
版本以及加密组件(从接收到的客户端加密组件中筛选的)以及生成的随机数(这里记为B) -
服务端发送Server Hello Done报文,报文中包含公开密钥证书CA
二、客户端与服务端互相确认身份
客户端通过证书校验服务端身份(在这个阶段,服务端也可以要求验证客户端的身份,即客户端发送其证书,服务端接收并验证)
三、产生通信密钥
-
证书校验通过,客户端生成一个随机数(这里记为C),发送Client Key Exchange报文,报文中包含Pre-master secret随机密码串,是使用服务端下发的证书中的公钥加密随机数C得到的。
-
客户端继续发送Change Cipher Spec报文,用于告知服务器客户端已经切换到之前协商好的加密套件的状态,准备使用之前协商的加密套件加密数据并传输
-
客户端发送Finished报文,报文中包含连接至今全部报文的整体校验值,用于服务器校验 。
-
服务器接收到客户端请求之后,使用私钥解密报文得到随机数C,并使用随机数A、B、C生成Session Key,作为后续传输数据使用的对称密钥。(客户端同样使用这三个随机数生成对称密钥Session Key)
-
服务器同样发送Change Cipher Spec报文,用于告知客户端服务器已经切换到之前协商好的加密套件的状态,准备使用之前协商的加密套件加密数据并传输
-
服务器发送Finished报文,报文中包含连接至今全部报文的整体校验值,用于客户端校验 ,至此
`SSL
连接建立完成。