TLS握手过程
什么是TLS
TLS是IETF对SSL进行标准化时,将其改名为Transport Layer Security(传输层安全)。严格说,SSL与TLS指代的协议的版本号不同,TLS1.0是SSL3.0的升级版。
握手
TLS的通信是通过对称加密进行的,也就是client与server使用同一个密钥进行加密和解密,那么这个密钥怎么从加密方传给解密方呢?如果直接从网络上传输,它就可能会被攻击者获取到,这样加密也就失去了意义。也就是说,发送密钥有被窃听的危险,但是不发送的话,接收方又不能解密。
所以为了安全的将密钥发送给接收方
首先会进行TCP的握手,即一次往返。然后开始TLS的握手。
四个阶段:
- client hello
- server hello
- client finish
- 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
- 支持的加密套件
server hello
server根据收到的信息
- 确认版本号
- 随机数2
- 选择加密套件
- server证书
client回应
首先验证证书,如果验证通过:
- 从证书内取出server公钥
- 随机数3,使用公钥加密
- client握手结束
server回应
- server握手结束
完成握手
两边都有了三个随机数,使用相同的加密算法,生成一个对称密钥。此后两边的应用数据都通过这个密钥进行加密。
对称加密于非对称加密
非对称加密算法最常用的是RSA算法,使用公钥和私钥进行加密和解密。缺点是速度慢,优点是安全性高。
对称加密算法,加密和解密使用同一个密钥。优点是速度快。
参考
https://www.jianshu.com/p/7158568e4867
图解HTTP
Web性能权威指南