详解TLS1.3的握手过程

最近学习了一下TLS几个版本的协议,今天来着重说明下TLS1.3的握手过程,通过对握手过程的说明你就可以清晰的明白为什么TLS1.3要比TLS1.2快那么多了,话不多说,先上TLS1.3的握手流程图:                 

                  详解TLS1.3的握手过程

                             

图中的ClientHello具体内容说明如下:

(1)客户端支持的ssl的最高版本号

(2)客户端支持的加密套件列表

(3)确定的会话ID

(4)客户端所支持的压缩算法列表

图中ServerHello的具体内容如下:

(1)服务端选择的ssl的版本(选择方式为选择客户端和服务端最高版本中的较低的那一个)

(2)服务端选择的密码套件

(3)会话ID

(4)客户端选择的压缩算法

那么TLS1.3比TLS1.2到底快在哪呢?我们再来看看TLS1.2的握手流程

             详解TLS1.3的握手过程

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重建会话过程如下:

                      详解TLS1.3的握手过程

(1)client发送ClientHello,并携带session id,这个session id就是用于回复会话,server端会存储关于session id的对应的通信秘钥

(2)server回复ServerHello,ChangeCipherSpec和Finished

而TLS1.3呢

                          详解TLS1.3的握手过程

可以看出,TLS1.3是对TLS1.2过程的优化,也就是直接加密数据然后发送。

当然了,TLS1.3还有很多其他的特性,这里稍微提一下,TLS1.3采用少即是多的思想,TLS1.2中原有的大量特性都被删除了,这些特性包括:

  • RSA**传输——不支持前向安全性
  • CBC模式密码——易受BEAST和Lucky 13攻击
  • RC4流密码——在HTTPS中使用并不安全
  • SHA-1哈希函数——建议以SHA-2取而代之
  • 任意Diffie-Hellman组——CVE-2016-0701漏洞
  • 输出密码——易受FREAK和LogJam攻击

TLS 1.3版本是对规范的重大修改,一些工作方式也非常不同:

  • 有一些新的密码套件仅在TLS 1.3下工作。一些旧的密码套件无法用于TLS 1.3连接。
  • 新的密码套件定义方式不同,且并未详细规定证书类型(如RSA、DSA、ECDSA)或**交换机制(如DHE或ECHDE)。这对密码套件的配置有暗示作用。
  • 客户端在客户问候消息(ClientHello)中提供一个“key_share”。这会对“组”配置产生影响。
  • 直到主握手完成以后,会话才会建立。在握手结束和会话建立之间可能会有一个间隙(理论上,会话可能根本不会建立),并可能对会话恢复代码产生影响。
  • 在TLS 1.3版本中,重新磋商是不可能的。
  • 现在大部分握手都会被加密。
  • 更多类型的消息现在可以有扩展(这对定制扩展API和证书透明系统有影响)。
  • 在TLS 1.3连接中不再允许使用DSA证书。