TLS连接建立流程

文章主要描述TLS连接建立流程。

1. 总体流程

  • 连接建立流程图

  • 加密协议簇

2. 握手阶段

  1. 客户端与服务器创建一个TCP连接
  2. 客户端向服务器发送hello报文,服务器向客户端发送CA证书(证书中包含服务器公钥)以证明身份
  3. 客户端生成一个会话密钥,用服务器所发送的公钥进行加密后发送给服务器。此时,仅有服务器与客户端均持有该密钥

3. 密钥导出

由会话密钥生成加密和完整性检查的密钥,客户端和服务器均持有生成的四个密钥

  1. 客户端>服务器报文加密密钥
  2. 客户端>服务器完整性检查密钥(MAC密钥)
  3. 服务器>客户端报文加密密钥
  4. 服务器>客户端完整性检查密钥(MAC密钥)

4. 数据传输

最简单的方法莫过于SSL传输数据时加密并传给TCP了,但是因为TCP是字节流的协议,这样做必须要在TCP会话结束后才能检查数传输的完整性。
为了解决该问题,将数据分割成记录,加密(记录+MAC)后传输给TCP。
就算是这样,也仍有问题尚未解决。中间人仍能通过对TCP报文段中序列号的修改达成删除,调换,插入报文的目的。
为了解决该问题,SSL维护一个序号计数器,加密(记录+MAC+序号)后传输给TCP。

接下来我们深入一下,进行更完整的描述

握手

  1. 客户端向服务器发送它所支持的加密算法和一个不重数
  2. 服务器从中选择一个对称加密算法,一个非对称加密算法和一种MAC算法,把选择以及CA证书(含公钥)以及一个服务器不重数发送给客户端
  3. 客户端验证证书提取服务器的公钥,随机生成一个密钥,把密钥用公钥加密后发送至服务器
  4. 服务器和客户端按照约定的算法,生成同刚才简略ssl中的四个密钥
  5. 客户端发送所有报文的MAC
  6. 服务器发送所有报文的MAC

之所以要进行五六步骤,因为第一个步骤中的报文是明文,为防止中间人对第一个报文进行篡改。
存在不重数是为了防止中间人进行重传攻击。

连接关闭

最简单的方法当然是发送一个TCP/FIN的报文段了。
但是这样会出现截断攻击,即会话未结束时中间人假冒其中一方关闭连接。
为了解决该方法,应该在类型字段中声明该记录是否用于终止SSL(虽然SSL类型是明文,但是进行了MAC鉴别)。
这样,如果SSL在收到终止记录前收到了TCP/FIN报文段,就知道会有猫腻了。

4. 总结