下图是HTTP Over TLS1.2
首次连接的握手,其中TCP的第三次握手和TLS的第一次握手结合:
这个过程由于太长,在复杂的网络情况下的连接建立容易产生较大时延,所以优化的方向比较统一:在保证安全的情况下,尽可能减少握手交换数据,加快连接的速度
TLS1.3
则实现了1RTT,甚至0RTT,而QUIC因为是基于Udp协议,所以也可做到0RTT。
这里讲一个TLS1.3和QUIC的事情,在2018年之前,因为TLS1.3还没有正式发布,所以QUIC使用的是自研的0RTT方式,叫做 QUIC crypto protocol
。所以看2018年之前的文章,会发现两者达到0RTT的方式是不一样的。而在2018年TLS1.3
正式发布,QUIC又和TLS同属IETF组织,所以自然而然的,QUIC统一使用TLS1.3作为安全协议。
The QUIC crypto protocol is the part of QUIC that provides transport security to a connection. The QUIC crypto protocol is destined to die. It will be replaced by TLS 1.3 in the future, but QUIC needed a crypto protocol before TLS 1.3 was even started.
感谢Google减少我们这些码农的学习成本~ 我们只需要弄清楚TLS1.3是如何实现0RTT的,就也能弄懂QUIC的了。
2.1.1 TLS1.3实现1RTT
首先看下TLS1.2协议握手图:
整个过程是2RTT,因为比较熟悉,就不再讲中间过程了。
接下来看下TLS1.3如何做到1RTT,看下面握手图:
来看下握手全程:
-
客户端发送:①:ClientHello,包含
Cipher Suite
(密码套件),②:Key Share
(DH密钥交换参数列表) -
服务端回复:①:ServerHello,包含 所选
Cipher Suite
,②:服务器证书,③使用证书对应的私钥对握手消息签名,将结果发出,④:选用客户端提供的DH参数生成临时公钥,并将公钥通过Key Share
发送出去
除此之外,结合选定的DH参数计算出用于加密Http的共享密钥
-
客户端接收到
Key Share
后,使用证书公钥对签名进行验证,获取服务端的公钥,并生成共享密钥 -
双方使用生成的共享密钥进行加密传输,完成TLS握手
相比于TLS1.2,TLS1.3最大改动其实就是去掉了 RSA的密钥交换,也就是TLS握手中的唯一一次非对称加密(不算签名验证)。
所以握手的时候,就不会再去发送那些和非对称加密相关的数据了,比如 客户端服务端随机数 Server/Client KeyExchange
、声明消息加密的信号 ChangeChiperSpec<