0 引言

随着移动网络的大步发展,4G技术普及之后,5G时代即将来临。手机网民规模快速增长,网民对移动互联网依赖度加大,轻型业务重心从固网转移到移动网络中。由于服务提供商与网民的安全观念加强,大量的HTTP(HyperText Transfer Protocol)网络流量更换为HTTPS(Hypertext Transfer Protocol Secure)加密流量;同时,由于国内日益严重的网络劫持,中间人钓鱼网站盛行,正常网站被插入广告,HTTP明文传输的不安全性,使得TLS(Transport Layer Security)加密成为硬需求。移动网络由于其特殊性,因移动终端在与WIFI或移动基站通讯时每次发送数据都会增加近100 ms的延迟,而基于上一代TLSv1.2的网络流量会比未加密流量增加四次通信时间,导致移动端体验降低。而TLSv1.3是一种全新的解决方案。

1 握手流程的对比

TLSv1.3的握手流程与之前的版本有了非常大的改进,总体来说是更加的安全和简洁,完全废弃了RSA密钥交换,直接使用ECDH(Elliptic-curve Diffie–Hellman)椭圆曲线密码交换算法进行密钥交换,增强安全性,减少初次握手时间。

1.1 TLSv1.2及之前版本握手基本过程(不考虑需要客户端证书的情况)

(1)客户端发出请求Client Hello,向服务器提供支持的加密协议版本,当前时间,生成一个客户端随机数,会话ID,支持的加密算法套件,支持的压缩方式。
(2)服务器发出Server Hello,向客户端确认使用的加密协议版本,当前时间,生成的一个服务器随机数,会话ID,确认加密算法套件,确认压缩方式。
(3)服务器发送服务器证书。
(4)服务器发送ServerKeyExchange消息,当证书消息无法满足需求时发送。
(5)服务器发送ServerHelloDone消息。
(6)客户端收到证书后,逐级检查证书是否合法,对过期、非对应域名证书或不是可信机构颁发的证书发出警告。当证书验证通过后,从证书中取出公钥,生成一个随机数并使用公钥加密发送给服务器(ClientKeyExchange)。
(7)客户端发出编码改变通知告知服务器使用协商的加密方法和密钥加密通信。
(8)服务器发送Finished消息。
(9)服务器发出编码改变通知,表明之后将使用协商的加密方式和密钥通信。此时服务器与客户端均有三个随机数组成会话密钥。
(10)服务器发送Finish消息,握手结束,开始HTTP通信。

图1 TLSv1.2与TLSv1.3握手流程

1.2 TLSv1.3中的1-RTT(Round-Trip Time)握手过程

(1)TLSv1.3中使用ECDH简化了握手过程,在Client Hello与Server Hello中完成了之前在TLSv1.2中的KeyExchange过程,简化KeyShare,并且不再完全依靠RSA密钥交换过程中的私钥。
(2)服务器收到ClientHello之后,使用ServerHello指定加密协议和参数,在服务器KeyShare之后的信息均为加密,包括证书的交换,这与TLSv1.2中不同。
1.3 TLSv1.3在移动网络的优势
在移动网络中延迟影响非常巨大,4G网络下每次收发信息会增加比有线网络更高的延迟成本。一条消息从美国发送至中国,延迟高达200毫秒以上,加上移动网络延迟不稳定,部分情况下甚至会产生100毫秒的额外延迟。因此TLSv1.3 1-RTT握手模式带来的速度优势不容小觑。同时TLSv1.3中引入了0-RTT握手的概念,通过事先与服务器握手后协商出一个PSK(Pre-shared key)预制密钥,之后可以直接向服务器发起加密请求,但是0-RTT模式不具备前向安全性也不能有效防止重放攻击,目前Nginx与FireFox可支持0-RTT模式。

2 TLSv1.3与HTTP服务搭建

2.1 HTTP服务器

Nginx是一个高性能Web服务器,也是目前最常用的开源Web服务器,能够使用和自己开发大量模块实现各种功能,并且方便与OpenSSL一同编译,得到支持TLSv1.3的HTTP服务器。

2.2 支持TLSv1.3的加密软件包

OpenSSL是一个被广泛使用的开源加密软件包,绝大多数TLS加密均使用OpenSSL提供支持,其OpenSSL 1.1.1版本已经支持到TLSv1.3 最终版本,同时可方便切换到TLSv1.2等低版本。

2.3 客户端软件

客户端使用Chrome最新版本70并在chrome://flags/中开启TLSv1.3 Final的支持,同时使用Wireshark监控握手时间与过程。

2.4 环境搭建

参考 使用NGINX与OPENSSL- 1.1.1开启 TLSV1.3

Nginx禁用ssl_session_timeout使得每次请求都将重新握手,加密套件使用AES-128-GCM-SHA256。

3 SSL握手时间测试

服务器使用国外高延迟服务器模拟移动网络,预先ping此服务器得到RTT min/avg/max/mdev = 272.159/292.563/307.886/10.084 ms
握手测试使用Chrome发起握手,Chrome提供了SSL握手时间数据,但是并不准确,因此使用Wireshark抓包并计算客户端发起Client Hello到握手完成的时间。

SSL握手时间 ms)
TLSv1.3            TLSv1.2
271.91            509.96
267.93            513.61
262.62            534.60
262.54            519.82
250.64            541.82
Avg 263.128     Avg 523.962

明显可见TLSv1.3比TLSv1.2至少节约一半的握手时间,与理论上TLSv1.3需要1-RTT、TLSv1.2需要2-RTT一致,并且在网络延迟时间越大的环境,取得的效果越为明显。TLSv1.3流量目前在网络中较少,但是我们将其部署于访问人数不多的博客中,在近一年的测试中,开启TLSv1.3的用户能够在网络情况较差的环境下明显感知TLSv1.3对网站访问速度带来质的提升。在未使用CDN(Content delivery network)网络的网站中,TLSv1.3能够极大的减少移动网络用户在浏览器输入网址后的白屏等待时间,提升流畅度,提高用户体验。可以说TLSv1.3为HTTPS的广泛部署扫清了最后的障碍,中小网站不会因为害怕启用HTTPS使用户体验降低而不使用HTTPS对网站进行加密,甚至会因为启用了HTTPS并同时开启HTTP/2使得网站访问速度进一步提升。