最近学习了一下TLS几个版本的协议,今天来着重说明下TLS1.3的握手过程,通过对握手过程的说明你就可以清晰的明白为什么TLS1.3要比TLS1.2快那么多了,话不多说,先上TLS1.3的握手流程图:
图中的ClientHello具体内容说明如下:
(1)客户端支持的ssl的最高版本号
(2)客户端支持的加密套件列表
(3)确定的会话ID
(4)客户端所支持的压缩算法列表
图中ServerHello的具体内容如下:
(1)服务端选择的ssl的版本(选择方式为选择客户端和服务端最高版本中的较低的那一个)
(2)服务端选择的密码套件
(3)会话ID
(4)客户端选择的压缩算法
那么TLS1.3比TLS1.2到底快在哪呢?我们再来看看TLS1.2的握手流程
TLS1.2的ClientHello和ServerHello和TLS1.3中的稍有不同,我们来看一下TLS1.2中的ClientHello和ServerHello的内容:
ClientHello的内容如下:
(1)客户端支持的ssl的最高版本号
(2)客户端支持的加密套件列表
(3)确定的会话ID
(4)客户端所支持的压缩算法列表
(5)一个用于生成主秘钥的32位随机数
ServerHello的内容如下:
(1)服务端选择的ssl的版本(选择方式为选择客户端和服务端最高版本中的较低的那一个)
(2)服务端选择的密码套件
(3)会话ID
(4)客户端选择的压缩算法
(5)一个用于生成主秘钥的32位随机数
我们可以看到,TLS1.2比TLS1.3在握手过程中多了一次握手,为啥会多这一次握手嘞?首先我们要理解握手的本质是为了什么,握手是为了协商出一个client和server端都认可的一个对称秘钥,典型的秘钥协商算法有两种,RSA和ECDH,简明介绍下这两种算法会让你对这个过程更加清晰。
首先是RSA的秘钥协商过程,RSA有一个很棒的特性:RSA算法给予server端一个公钥和私钥,一段消息既可以用公钥加密,然后用私钥解密,也可以用私钥加密,用公钥解密。公钥是什么呢?你可以理解成服务器从CA那得到的证书。好,我们来看下TLS1.2的秘钥协商过程,首先client发一个client_hello,然后server端收到这个消息后,回传一个server_hello(client_hello和server_hello中的内容就在上面讲了),一个证书(关键点),client收到证书后,用公钥(也就是证书)加密一段随机数发回给server,server收到后用私钥解密得到这段随机数,这段随机数就作为对称加密的秘钥了,至此握手就完成。
然后我们来看下ECDH的秘钥协商过程,首先EC的意思是椭圆曲线,这个EC提供了一个很厉害的性质,你在曲线上找一个点P,给定一个整数K,求解Q=KP很容易,给定一个点P,Q,知道Q =KP,求K却是个难题。在这个背景下,给定一个大家都知道的大数G,client在每次需要和server协商秘钥时,生成一段随机数a,然后发送A=a*G给server,server收到这段消息(a*G)后,生成一段随机数b,然后发送B=b*G给client,然后server端计算(a*G)*b作为对称秘钥,client端收到后b*G后计算a*(G*b),因为(a*G)*b = a*(G*b),所以对称秘钥就是a*G*b啦,攻击者只能截获A=a*G和B=b*G,由于椭圆曲线难题,知道A和G是很难计算a和b的,也就无法计算a*G*b了(当然,实际上的计算过程和原理证明不是这么简单的,中间还有一个取模的过程,以及取模过程的交换律和结合律证明,但是本质思想和这个是差不多的)。反应在TLS1.2中,client发送client_hello,server收到后发送server_hello和ECC证书(B =b*G),client收到后就生成随机数a,然后发送a*G给server,并记录秘钥,server收到a*G后计算对称秘钥,握手就结束了。而为什么在TLS1.3会有区别呢,留意下TLS1.3图中的key_share,这段的功能就是直接记录了a*G,然后包含在client_hello中。然后server收到后在server_hello的key_share段中记录b*G。所以TLS1.3一个RTT就搞定握手了。
至此,你应该已经对于为什么TLS1.3要快一个RTT有一定概念了吧,TLS1.3舍弃了RSA的协商过程,然后基于ECDH的算法优化了整个过程。(这里提下ECDHE,多的这个E是extemporaneous,临时的意思,临时的是ECC证书中的随机数,每次都会重新生成,也是是b*G中的b)。
当然,TLS1.3不仅仅只做了这么一点优化,还有典型的连接回复过程,TLS1.3做到了0-RTT的过程,TLS1.2重建会话过程如下:
(1)client发送ClientHello,并携带session id,这个session id就是用于回复会话,server端会存储关于session id的对应的通信秘钥
(2)server回复ServerHello,ChangeCipherSpec和Finished
而TLS1.3呢
可以看出,TLS1.3是对TLS1.2过程的优化,也就是直接加密数据然后发送。
当然了,TLS1.3还有很多其他的特性,这里稍微提一下,TLS1.3采用少即是多的思想,TLS1.2中原有的大量特性都被删除了,这些特性包括:
TLS 1.3版本是对规范的重大修改,一些工作方式也非常不同: