1.客户端发送Client Hello报文开始SSL通讯。报文包含客户端支持的SSL的指定版本,加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度)。
2.服务器可以进行SSL通讯时,会以Server Hello报文作为应答。和客户端一样,在报文中包含SSL版本以及加密组件。服务器端加密组件内容是从步骤1接收到客户端加密组件内筛选出来的。
3.之后服务器发送Certificate报文。报文中包含公开密钥证书。
4.最后服务器发送Server Hello Done报文通知客户端,最初阶段的SSL握手协商部分结束。
--4a.在客户端的证书验证过程为:用数字证书认证机构的公钥(一般在浏览器内置了)对签名进行解密得到摘要1,使用认证机构同样的摘要算法对证书源文件计算得到摘要2,比对摘要1和摘要2是否一致即可确认信息是否被篡改。客户端确认证书有效后就可以从服务器证书取出公开密钥使用了。
--4b.客户端随机生成Pre-master Secret(主要是通过RSA或者Diffie-Hellman算法生成)放入Client Key Exchange报文中。
--4c.使用证书携带的公开密钥对Client Key Exchange报文加密处理。
--4d.用Pre-master secret生成 master secre;还有生成CBC模式的初始向量(CBC模式第一次明文块做XOR的时候需要用到的初始向量,只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但如果一个分组丢失,后面的分组将全部作废,即同步错误)。
5.SSL第一次握手结束并验证通过后,客户端以Client Key Exchange报文作为回应。报文中包含通信加密中使用的一种称为Pre-master secret的随机密码串。该报文已经用步骤3中的公开密钥进行加密。
--5a.服务器使用Pre-master secret 生成master secret。还有生成CBC模式的初始向量。
Client Hello 和Server Hello阶段都会发送各自的Random随机数给对方,最终都是用来计算Master Secret的。
6.接着客户端继续发送Change Cipher Spec报文。该报文会提示服务器,在此报文之后的通信会采用Pre-master secret密钥加密。
7.客户端发送Finished报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否成功,要以服务器是否能够正确解密该报文作为判定标准。(已采用Pre-master secret密钥加密)
8.服务器同样发送Change Cipher Spec报文。
9.服务器同样发送Finished报文。
10.服务器和客户端的Finished报文交换完毕之后,SSL连接建立完成,通信会受到SSL的保护。从此处开始进行应用层协议的通信,即发送HTTP请求。
11.应用层协议通信,即发送HTTP响应。
12.最后由客户端断开连接。断开连接时,发送close notify报文。上图做了一些省略,这步之后再发送TCP FIN报文来关闭与TCP的通讯。
在以上流程中,应用层发送数据室会附加一种叫MAC的报文摘要。其能够查知报文是否遭到篡改,从而保护报文的完整性。
参考:
http://kb.cnblogs.com/page/194742/
http://www.jianshu.com/p/b894a7e1c779
https://segmentfault.com/a/1190000002554673
Https SSL/TLS Pre-master Secret到 Master Secret的计算
http://www.linuxidc.com/Linux/2015-07/120230.htm
http://www.enkichen.com/2016/02/26/digital-certificate-based/
还有openssl源码里的doc/HOWTO
来源:https://www.cnblogs.com/zhanghonglang/p/7744350.html