制定进展
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 起,便开始支持TLSv1.3,可以看到有一条这样的介绍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/#tls13-variant
- 选择
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
。
新增加密套件
- TLS-CHACHA20-POLY1305-SHA256
- TLS-AES-256-GCM-SHA384
- TLS-AES-128-GCM-SHA256
配置参考1
2
3
4
5ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
ssl_early_data on;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";