TLS1.3初探

今年8月,互联网工程任务组(IETF)正式发布TLS1.3协议的最终版本(RFC 8446),该协议在安全性、性能和隐私方面有重大改进,大大提升HTTPS连接的速度性能。这并不是一次大版本更新,而是一次迭代改进,ETF 是由来自世界各地的工程师组成的团队,他们在此标准上进行合作,用了超过四年,起草了 28 份草案后,才通过 TLS 1.3。

TLS简介

TLS(Transport Layer Security )的中文全称是安全传输层协议,TLS的设计目标是在传输层之上,构建一个安全传输层。
因为有了TLS的存在,HTTP协议栈增加了安全性。变成了目前大规模使用的HTTPS。SSL是TLS的前身。在TLS1.3发布之前,TLS 1.2是该协议的最新版本。TLS是保护Web应用程序和Web浏览器之间通信的标准,但更常见的是通常位于可靠传输层上的客户端和应用程序之间。

TLS历史

网景公司针对传输层协议(TCP/UDP)并没有对传输的数据进行加密保护的缺陷,为自家浏览器设计了SSL协议,于1995年公开协议的2.0版本。1999年,IETF小组基于SSL 3.0设计了与SSL协议独立的TLS 1.0协议,正式成为互联网传输层加密的标准。此后,TLS协议于2006年、2008年再次经历更新,分别命名为TLS 1.1和TLS 1.2。

如今的TLS协议不仅被用于传输层通讯,更作为一个标准的加密保护协议被广泛应用于 FTP, 电子邮件和VPN等领域,时刻保护着我们网络通信的安全。

TLS 1.3版本的更新与废除

版本的SSL协议被公认在完整性校验、密钥协商过程中有重大缺陷,因此,2011年与2015年IETF小组相继声明禁止使用SSL2.0,3.0

TLS协议针对此前披露的漏洞做了相应的处理,但是因为其复杂性,还没有一个版本能真正保证绝对的安全。
目前最新版本的TLS 1.2发布距今已有九年时间,在此期间,许多SSL/TLS协议的新漏洞被发现,比如针对其压缩机制的CRIME漏洞,针对CBC块加密模式的BEAST漏洞(主要是针对SSL 3.0和TLS 1.0),早已不再是当初设计者认为的那么安全,人们迫切需要新的协议将其代替。

SSL/TLS协议为网络通信提供了以下两种功能:

建立一个安全的连接:对其中传输的数据提供加密保护,防止被中间人嗅探到可见明文;对数据提供完整性校验,防止传输的数据被中间人修改。

建立一个可信的连接:对连接双方的实体提供身份认证。

上述功能在以往的TLS协议中是这样实现的:
加密:使用对称加密算法(块加密、流加密)加密会话数据,密钥交换主要通过非对称算法加密会话过程中使用的对称密钥传递给对方来实现(RSA)。从TLS 1.0起引入了DH密钥交换算法作为另一种可选的密钥交换算法。

完整性校验

使用MAC对发送的报文进行完整性校验计算,先计算MAC再加密。在TLS 1.2中引入了更具有安全性的AEAD算法(同时完成加密和完整性校验)作为一个加密机制的备选选项 。

身份认证

所有的身份认证都基于证书公钥体系完成。

因为RSA密钥交换过程安全性完全依赖于服务器私钥的安全性,TLS 1.3彻底废弃了RSA密钥交换算法,先计算MAC再加密的方法存在相当的安全缺陷,TLS 1.3废弃了使用MAC的块加密和流加密机制,仅采用AEAD类对称加密算法作为唯一的加密选项。 此外,TLS 1.3引入了一种新的密钥协商机制——PSK(PreSharedKey)。

其他大的改变还包括:

支持0-RTT数据传输

废弃了3DES、RC4、AES-CBC等加密组件。废弃了SHA1、MD5等哈希算法。

不再允许对加密报文进行压缩、不再允许双方发起重协商,密钥的改变不再需要发送change_cipher_spec报文给对方。

握手阶段的报文可见明文大大减少。

安全性大大增加

TLS 1.3 握手优化以及减少时延

TLS 1.2的握手框架

第1步:整个连接是从客户端向服务器发送“Client Hello”消息开始。该消息由加密信息组成,与此同时客户端也会将本身支持的所有密码套件(Cipher Suite)列表发送过去,包括支持的协议和支持的密码套件,也包含一个随机值或随机字节串。

第2步:响应客户端的“客户端问候”消息,服务器以“Server Hello”消息响应。此消息包含服务器已从客户端提供的CipherSuite中选择的CipherSuite。服务器还会将其证书以及会话ID和另一个随机值一起发送。

第3步:客户端验证服务器发送的证书。验证完成后,它会发送一个随机字节字符串,也称为“预主密钥”,并使用服务器证书的公钥对其进行加密。
客户端向服务器发送“ChangeCipherSpec”消息,通过会话密钥的帮助让它知道它将切换到对称加密。与此同时,它还发送“客户端已完成”消息。

第4步:一旦服务器收到预主密钥,客户端和服务器都会生成一个主密钥以及会话密钥(临时密钥)。这些会话密钥将用于对称加密数据。在答复客户端的“更改密码规范”消息时,服务器执行相同操作并将其安全状态切换为对称加密。服务器通过发送“服务器已完成”消息来结束握手。
在客户端和服务器之间进行了两次往返(2-RTT)以完成握手。 平均而言,这需要0.25秒到0.5秒之间的时间。 但是,它可能需要更多取决于几个因素。 起初,半秒时间似乎不是很多时间,但这只是握手,数据传输还没有开始。

TLS1.3 在握手上做了优化,只需要一次时延往返就可以建立连接(1-RTT)

RTT(Round-Trip Time):往返时延。在计算机网络中它是一个重要的性能指标,表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。

TLS 1.3握手框架

第1步,客户端发送 ClientHello 消息,该消息主要包括客户端支持的协议版本、DH 密钥交换参数列表 KeyShare;

第2步,服务端回复 ServerHello,包含选定的加密套件;发送证书给客户端;使用证书对应的私钥对握手消息签名,将结果发送给客户端;选用客户端提供的参数生成 ECDH 临时公钥,结合选定的 DH 参数计算出用于加密 HTTP 消息的共享密钥;服务端生成的临时公钥通过 KeyShare 消息发送给客户端;

第3步,客户端接收到 KeyShare 消息后,使用证书公钥进行签名验证,获取服务器端的 ECDH 临时公钥,生成会话所需要的共享密钥;

第4步,双方使用生成的共享密钥对消息加密传输,保证消息安全。

TLS1.2与1.3握手区别

TLS1.3的握手流程于TLS1.2最大的区别,就在于TLS1.3提前走了加密,TLS1.2需要在双方明文交换了key exchange信息之后才会走加密通道,而TLS1.3在sever端发送玩ServerHello信息之后就会走加密通道,就连证书信息也是加了密的。

下图通过Wireshake抓包,可以清楚的看到TLS1.3只需要1-RTT就可以建立连接

Web性能的一个重要组成部分是传输延迟。简而言之,传输延迟是指消息通过网络从一方传送到另一方所需的时间。较低的延迟意味着更快的网页和更具响应性的API; 当谈到响应性时,每毫秒都很重要。TLS1.3极大的缩短了建立连接所需要的时间。
TLS 1.3 改进增加了“不额外增加网络延时”模式(0-RTT)。对于近期访问过的站点,可以直接发送有用的数据,而不需要经过握手。
TLS 1.2 中通过 1 个 RTT 即可完成会话恢复,TLS 1.3在回复会话时只需要0-RTT。

TLS 1.3 0-RTT

当一个支持 TLS 1.3 的客户端连接到同样支持 TLS 1.3 的服务器时, 客户端会将收到服务器发送过来的 Ticket 通过相关计算,一起组成新的预共享密钥,PSK (PreSharedKey)。客户端会将该 PSK 缓存在本地,在会话恢复时在 Client Hello 上带上 PSK 扩展,同时通过之前客户端发送的完成(finished)计算出恢复密钥 (Resumption Secret)通过该密钥加密数据发送给服务器。服务器会从会话 Ticket 中算出 PSK,使用它来解密刚才发过来的加密数据。至此完成了该 0-RTT 会话恢复的过程。

开启TLS1.3

OpenSSL支持

近期OpenSSL也发布了一篇新文章Using TLS1.3 With OpenSSL。
该文章介绍了新版本的开发进展及一些需要注意事项。
OpenSSL 1.1.1 版本发布,该版本将支持 TLSv1.3,将完全兼容于原有1.1.0,理论上,只要应用支持 1.1.0,那么可以直接升级到 1.1.1。将自动支持 TLSv1.3,而不需要做任何其他操作。
编译的时候,需增加选项enable-tls1_3。

浏览器支持

目前最新版本的 Chrome 和 Firefox 都支持 TLS 1.3,但是都需要手动开启。

在 Firefox 中手动启用 TLS 1.3

Mozilla Firefox 用户可以通过以下方式在 Firefox 中启用 TLS 1.3 支持( 请注意,Firfox Nightly版本默认支持 TLS 1.3,而 Firefox 稳定版(截至日前是 Firfox 57)需要专门配置以支持 TLS 1.3 )。
在 Firefox 地址栏中输入 about:config。如果显示警告屏幕,请确认您要小心,可忽略安全提示;
在搜索区域搜索 security.tls.version.max;
通过双击它将首选项的值更改为 4( 默认为 3 )。

在 Chrome 中手动启动 TLS 1.3

Google Chrome 用户可以通过以下方式在 Chrome 中启用 TLS 1.3 支持( 请注意,Chrome Canary 版本默认支持 TLS 1.3,而 Chrome 稳定版(截至日前是Chrome 64) 需要专门配置以支持 TLS 1.3 )
在浏览器的地址栏中加载 chrome://flags/,这将打开 Web 浏览器的实验页面。
在搜索区域搜索 TLS 或者 tls ,找到 TLS 1.3 选项,默认为 Default
需要将 TLS 1.3 改为 Enabled (Draft);
重新启动 Web 浏览器。
注意:Chrome 62 之前的版本需要将 Maximum TLS version enabled 改为 TLS 1.3。

发表评论