TLS握手过程

什么是TLS #

TLS是IETF对SSL进行标准化时,将其改名为Transport Layer Security(传输层安全)。严格说,SSL与TLS指代的协议的版本号不同,TLS1.0是SSL3.0的升级版。

握手 #

TLS的通信是通过对称加密进行的,也就是client与server使用同一个密钥进行加密和解密,那么这个密钥怎么从加密方传给解密方呢?如果直接从网络上传输,它就可能会被攻击者获取到,这样加密也就失去了意义。也就是说,发送密钥有被窃听的危险,但是不发送的话,接收方又不能解密。

所以为了安全的将密钥发送给接收方

首先会进行TCP的握手,即一次往返。然后开始TLS的握手。

四个阶段:

  1. client hello
  2. server hello
  3. client finish
  4. server finish

主要做了两件事:确定协议版本和加密套件、生成加密密钥。TLS的握手主要由3个阶段来完成这两件事。

第一件事比较简单,只需要client告诉server自己支持的协议的版本和支持的加密套件,然后server选择并通知client。就可以啦。这两个操作分别在握手的第一第二阶段完成。

第二件事就没那么简单来。协议规定,生成一个加密密钥需要三个随机数,其中前两个随机数分别在第一阶段和第二阶段,由client和server分别生成并告诉对方。第三个随机数的交换要稍微复杂一点。

  • 首先client在第二阶段得到来server的证书,证书中包含来server的公钥。
  • 然后client会使用这个公钥对第三个随机数进行加密,然后将随机数的密文传给server。
  • 最后,server将密文解密,得到了第三个随机数。

这样,client和server两端就都有了这三个随机数,然后它们使用相同的算法生成一个密钥,用这个密钥来对数据进行对称加密,在将密文在网络中传输。

为什么第三个随机数要这么麻烦呢?

首先,client和server都会发送和接收数据,所以两边都要进行加密和解密。加密算法主要就两类:对称和非对称。非对称的性能差,所以就选择性能好的对称算法。而对称算法的密钥需要两端都知道才可以,因此使用非对称加密将密钥从一边发送给另一边。又为了保证随机性,就用三个随机数来生成密钥。

下面具体说一下这四个阶段都做了什么。

第一步,client需要告诉server自己支持的版本号和加密套件,还要生成随机数2,用于计算加密密钥。client把这三个信息告诉来server。

第二步,server在拿到这些信息后,它会选择一个版本号和一个加密套件。然后跟第一步一样,生成随机数2,也是用于计算加密密钥。在加上自己的证书,将这四项数据发回给client。

第三步,client首先验证证书的有效性,若有效从中取出server的公钥。生成随机数3,使用公钥对其进行加密,并发送给server密文,并告诉server之后的消息开始加密了。还会将前面的握手信息的摘要进行加密后传给server,server收到后将其解密,用于验证协商的密钥的一致性。

第四步,

client hello #

client告诉server:

  1. 协议版本号
  2. 随机数1
  3. 支持的加密套件

server hello #

server根据收到的信息

  1. 确认版本号
  2. 随机数2
  3. 选择加密套件
  4. server证书

client回应 #

首先验证证书,如果验证通过:

  1. 从证书内取出server公钥
  2. 随机数3,使用公钥加密
  3. client握手结束

server回应 #

  1. server握手结束

完成握手 #

两边都有了三个随机数,使用相同的加密算法,生成一个对称密钥。此后两边的应用数据都通过这个密钥进行加密。

对称加密于非对称加密 #

非对称加密算法最常用的是RSA算法,使用公钥和私钥进行加密和解密。缺点是速度慢,优点是安全性高。

对称加密算法,加密和解密使用同一个密钥。优点是速度快。

发送对称加密的密钥.png1

参考 #

https://www.jianshu.com/p/7158568e4867

图解HTTP

Web性能权威指南


  1. 上野宣. 图解HTTP.于均良.北京:人民邮电出版社,2014.5 ↩︎