最近几天突然对HTTPS的内部工作流程有点好奇,所以跟同事一起查阅资料探讨了一下,写下这几篇总结加深下印象。
这一篇先讲讲SSL层的握手过程,我们来根据图片一步步讲解,图片如下:
整个握手分为四个阶段:
1. 客户端像服务端发起请求,请求的信息都是明文,信息包括以下几个部分:
a. content type 消息的内容类型,告诉服务器,我要握手了 handshake
b. TSL version 协议版本
c. session id/session ticket,用于会话缓存,减少握手耗时,第一次传空代表是新会
话,不需要去查找恢复之前存在的会话。
d. cipher suites 客户端支持的加密套件列表
e. compression methods(压缩算法列表,用于后续的信息压缩传输)
f. Random 产生一个随机数 Random_C
g. Extensions 附加的其他信息 如SNI
2. 服务端收到客户端的信息后,会以明文形式返回如下信息:
a. content type 消息的内容类型,握手 handshake
b. TSL version 协议版本
c. session id/session ticket,用于会话缓存,服务端生成session id/Session ticket
报文(包括主密钥在内的会话信息,masterkey)代表该次会话返回给客户端
d. cipher suites 选中加密套件列表中要用的加密算法
e. compression methods(压缩算法列表,用于后续的信息压缩传输) 选中压缩算法
f. Random产生一个随机数 Random_S
g.Certificate 服务端的CA证书
h.Extension 附加信息
3. 客户端收到服务端返回的信息后首先对证书进行校验(这一步见第二篇文章)
4. 客户端校验证书通过后做如下操作
a. 校验通过后, 客户端可以拿到证书中的服务端的公钥,然后产生一个随机数假设
为Random_C1,通过公钥对这个随机数进行加密。生成一个pramaster-key. 将这个
premaster-key传给服务器,同时,客户端通过
Random_C,Random_S,Random_C1,经过特定算法在客户端生成一个密钥。
b change cipher spec, 发送告诉服务端正式变更双方传输数据时候的加密算法和密钥
c encrypted handshake message,是指校验数据的完整性,是否有被串改
或者遗失,校验的方式是:将所有传到服务端的参数通过散列的hash算法
生成一段字串, 然后用上述跟服务端商量好的加密算法和密钥对这段字串
进行加密,传输给服务端。
d. session id/ session ticket session id是保存在服务器的session域的,每次带上
可以直接找到会话,而session ticket呢则是将接收到的masterkey 和
session ticket组成键值对保存在客户端,方便下次会话的时候如果存在
session ticket则直接带上去请求服务器,可以恢复会话。
5. 服务端收到客户端发送过来的消息后,进行如下操作:
a. 通过公钥加密传输过来的premaster-key,服务端使用私钥进行解密。得到第三个随
机数 Random_C1, 然后服务端也同时根据Random_C, Random_S,
Random_C1,经过跟客户端 一样的特定算法在服务端生成一个和客户端相同的
密钥。(注意, 这个密钥是在各自的端通过某种特定算法生成的, 而没有通过
网络传输,所以可以防止被盗取)
b. 服务端把所有接收到的客户端的参数通过散列的hash算法生成一段字串, 然后
通过约定的加密算法和生成的密钥解密客户端传过来的加密的字串, 拿两个字串
对比 ,如果不相等则说明中间被人篡改,则该次握手失败。如果相同则继续往下。
c. change cipher spec, 发送告诉客户端正式变更双方传输数据时候的加密算法和密钥
d. encrypted handshake message,是指校验数据的完整性,是否有被串改
或者遗失,校验的方式是:将所有传到客户端的参数通过散列的hash算法
生成一段字串, 然后用上述跟客户按端商量好的加密算法和密钥对这段字串
进行加密,传输给客户端端。
6. 客户端对服务端发回来的校验的数据进行验证:
客户端把所有接收到的服务端的参数通过散列的hash算法生成一段字串, 然后
通过约定的加密算法和生成的密钥解密客户端传过来的加密的字串, 拿两个字串
对比 。对比成功则握手成功。
7. 开始使用约定好的加密算法和密钥传输数据。数据传输的加密算法一般是对称加密,
传输速度块。
以上就是SSL/TSL握手的全部过程。