TLS 1.3:改进延迟,部分握手加密

制定进展

IETF正在制定TLS协议的最新版本1.3,截至目前还没有正式发布,新的 TLS 1.3 基于 TLS 1.2,将移除对部分弱加密算法如 MD5 和 SHA-22 的支持。

TLSv1.3 新特性

  • 将不再支持静态RSA密钥交换,握手将默认使用前向安全(Perfect Forward Secrecy),一个安全性足够强的 Diffie-Hellman 参数。
  • 将移除 ChangeCipherSpec协议。
  • 将大幅改进握手,注重隐私,在握手尽可能早的阶段加密信息,ServerHello 之后的所有消息都是加密的,客户端只需要一次往返就能与服务器建立安全和验证的连接。
  • 客户端将在 ClientHello 阶段将提高 key_share(共用密钥)。
  • Sessions 将在握手完成之后,才会被建立。
  • Renegotiation攻击不可能发生。
  • 绝大部分的握手将处于加密状态。
  • 很多类型的信息现在也有了扩展(如 Certificate Transparency)
    改进后的握手流程

支持程度

  • nginx
    在 nginx 的最新 mainline 版本 1.13.0 中,可以看到有一条这样的介绍
    1
    Feature: the "TLSv1.3" parameter of the "ssl_protocols" directive.

也就是nginx在最新的版本已经加入这个配置选项,并且支持1.3版本的 TLS 了。

  • Firefox
    Firefox 52 已正式支持 TLS 1.3。
  • Chrome Dev
    Google Chrome 浏览器已经在测试版本中开始支持TLS 1.3了。

速度提升

在升级 HTTPS 的过程中,很多大型网站会有所顾虑,因为相比传统 HTTP 协议,TLS 的握手会耗费更多的延时,进而会影响网站的打开时间,并且使用TLS还是有可能在第一次连接的时候受到中间人攻击。
在 TLS 1.2 时代,我们可以通过完美前向加密、HTTP/2、HSTS、HSTS preload list、CHACHA20_POLY1305 协议等方式,提升网站的安全性,加快网站的访问速度,这方面也确实起到了很好的效果。

降低延时

访问安全加密网站时,首先要建立共用密钥,这一过程叫做一次握手。有专门的加密消息往来于浏览器和网站之间,每一次连接,TLS握手就随之发生。
通过移动网络访问时,由于 4G 网络的延时,加载时间可能会增加上百ms不等,也会影响到用户体验。

两代协议握手对比
对于 TLS 1.2,每次请求需要2次消息往来,才能完成握手。
对于 TLS 1.3,首次握手只需要1次消息往来,可以节约几十到上百ms不等。

TLS 1.3 改进增加了“不额外增加网络延时”模式(0-RTT)。对于近期访问过的站点,可以直接发送有用的数据,而不需要经过握手。
针对0-RTT及其他相关的扩展性,早在2016年5月之前,微信就基于TLS1.3草案标准,设计实现了一套安全通信协议mmtls。基于TLS1.3的微信安全通信协议mmtls介绍

因此,加上 HTTP/2 对多资源加载的优化,通过 HTTPS + HTTP/2 完全有希望使得速度比传统 HTTP 协议更快更安全。

Chrome 开启TLSv1.3

在地址栏输入chrome://flags/

  • 找到Maximum TLS version enabled.并选择TLS 1.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

新增加密套件

  • TLS13-AES-256-GCM-SHA384
  • TLS13-CHACHA20-POLY1305-SHA256
  • TLS13-AES-128-GCM-SHA256
  • TLS13-AES-128-CCM-8-SHA256
  • TLS13-AES-128-CCM-SHA256