关于TLS1.3

发布时间:2018/6/18 23:19:53 打印 字号:
什么是TLS1.3

 TLS1.3是一种新的加密协议,它既能提高各地互联网用户的访问速度,又能增强安全性。

我们把使互联网实现安全通信的基础性技术称为传输层安全协议(TLS)。TLS是安全套接层协议(SSL)的进化版本,SSL是由Netscape公司在1990年代研发的。国际互联网工程任务组(IETF)做为一个标准化组织,负责定义该协议,该协议已经历了多次修订。最新版本TLS1.2在2008年被确立为标准,目前被大多数浏览器和启用HTTPS的web服务所支持。

 

TLS1.3和早前版本TLS1.2-1.0的对比

在 Web 领域,传输延迟(Transmission Latency)是 Web 性能的重要指标之一,低延迟意味着更流畅的页面加载以及更快的 API 响应速度。而一个完整的 HTTPS 链接的建立大概需要以下四步:

第一步:DNS 查询

浏览器在建立链接之前,需要将域名转换为互联网 IP 地址。一般默认是由你的 ISP DNS提供解析。ISP 通常都会有缓存的,一般来说花费在这部分的时间很少。

第二步:TCP 握手( 1 RTT)

和服务器建立 TCP 连接,客户端向服务器发送 SYN 包,服务端返回确认的 ACK 包,这会花费一个往返(1 RTT)

第三步:TLS 握手 (2 RTT)

该部分客户端会和服务器交换密钥,同时设置加密链接,对于 TLS 1.2 或者更早的版本,这步需要 2 个 RTT

第四步:建立 HTTP 连接(1 RTT)

一旦 TLS 连接建立,浏览器就会通过该连接发送加密过的 HTTP 请求。

我们假设 DNS 的查询时间忽略不计,那么从开始到建立一个完整的 HTTPS 连接大概一共需要 4 个 RTT,如果是浏览刚刚已经访问过的站点的话,通过 TLS 的会话恢复机制,第三步 TLS 握手能够从 2 RTT 变为 1 RTT。

tls1.3.png

TLS 1.2 中通过 1 个 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 会话恢复的过程。

以上简单描述了 TLS 1.3 建立连接的大致流程,也解释了为什么 TLS 1.3 相比于之前的 TLS 1.2 会有更出色的性能表现。

当然 TLS 1.3 还有非常非常多的细节以及安全特性,优点以及缺点(去除静态 RSA 和 DH 密钥协商、禁止 RC4、有副作用的 0-RTT 握手存在重放攻击,不支持前向保密…..),限于篇幅并没有更深入的去探讨。

 

总结

TLS 1.3 将是 Web 性能以及安全的一个新的里程碑,随之 TLS1.3 带来的 0-RTT 握手,淡化了大家之前对使用 HTTPS 性能上的隐忧。于此同时,在未来随着 HTTP/2 的不断普及,强制性使用 HTTPS 成为了一种必然。

 

如何开启TLS1.3

目前需要使用 OpenSSL 1.1.1 的 draft-18 分支,详细可以代码如下,先需要重新编译安装OpenSSL

git clone -b tls1.3-draft-18 --single-branch https://github.com/openssl/openssl.git openssl
编译安装Nginx:
wget -c https://nginx.org/download/nginx-1.13.4.tar.gz

tar zxf nginx-1.13.4.tar.gz


cd nginx-1.13.4/


./configure --add-module=../ngx_brotli --add-module=../nginx-ct-1.3.2 --with-openssl=../openssl --with-openssl-opt='enable-tls1_3 enable-weak-ssl-ciphers' --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module


make

sudo make install
配置Nginx支持TLS1.3
ssl_protocols              TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

ssl_ciphers                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:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
在客户端浏览器里面开启TLS1.3选项:

Chrome:

chrome://flags/ 中的 Maximum TLS version enabled 改为 TLS 1.3(Chrome 62 中需要将 TLS 1.3 改为 Enabled (Draft);

Firefox:

about:config 中的 security.tls.version.max 改为 4;

备注:

虽然TLS1.3的性能上面非常好,但是目前支持TLS1.3协议的客户端还比较少,建议暂时不要在生产环境使用,等OpenSSL出正式版,另外大部分客户端支持该协议后再进行升级为好!