TLS 1.3 协议针对安全强化及效率提升等方面进行了大量修改, 相继推出 20 多个草案版本, 即将完成最终的标准化标准完成后, OpenSSL 组织将推出 OpenSSL 1.1.1 版本, 对 TLS1.3 协议标准提供支持
本文主要讲解 TLS 1.3 版本的相关特性以及如何在你的服务器上启用 TLS 1.3 的支持
在谈 TLS 1.3 之前, 我们先来看下 TLS 1.2 的工作模式, 如图所示是 TLS 1.2 客户端和服务端交互的过程, 如图所示:
我们也可以通过 Wireshark 抓包得到的数据
以 ECDHE 密钥交换算法为例, TLS1.2 协议完整的 SSL 握手过程如下:
第一步, 首先客户端发送 ClientHello 消息, 该消息中主要包括客户端支持的协议版本加密套件列表及握手过程需要用到的 ECC 扩展信息;
第二步, 服务端回复 ServerHello, 包含选定的加密套件和 ECC 扩展; 发送证书给客户端; 选用客户端提供的参数生成 ECDH 临时公钥, 同时回复 ServerKeyExchange 消息;
第三步, 客户端接收 ServerKeyExchange 后, 使用证书公钥进行签名验证, 获取服务器端的 ECDH 临时公钥, 生成会话所需要的共享密钥; 生成 ECDH 临时公钥和 ClientKeyExchange 消息发送给服务端;
第四步, 服务器处理 ClientKeyExchange 消息, 获取客户端 ECDH 临时公钥; 服务器生成会话所需要的共享密钥; 发送密钥协商完成消息给客户端;
第五步, 双方使用生成的共享密钥对消息加密传输, 保证消息安全
可以看到, TLS1.2 协议中需要加密套件协商密钥信息交换 ChangeCipherSpec 协议通告等过程, 需要消耗 2-RTT 的握手时间, 这也是造成 HTTPS 协议慢的一个重要原因之一
我们来看下 TLS 1.3 的的交互过程, 如图所示:
其抓包得到的数据流如下:
在 TLS 1.3 中, 客户端首先不仅发送 ClientHello 支持的密码列表, 而且还猜测服务器将选择哪种密钥协商算法, 并发送密钥共享, 这可以节省很大一部分的开销, 从而提高了速度
TLS1.3 提供 1-RTT 的握手机制, 还是以 ECDHE 密钥交换过程为例, 握手过程如下将客户端发送 ECDH 临时公钥的过程提前到 ClientHello, 同时删除了 ChangeCipherSpec 协议简化握手过程, 使第一次握手时只需要 1-RTT, 来看具体的流程:
客户端发送 ClientHello 消息, 该消息主要包括客户端支持的协议版本 DH 密钥交换参数列表 KeyShare;
服务端回复 ServerHello, 包含选定的加密套件; 发送证书给客户端; 使用证书对应的私钥对握手消息签名, 将结果发送给客户端; 选用客户端提供的参数生成 ECDH 临时公钥, 结合选定的 DH 参数计算出用于加密 HTTP 消息的共享密钥; 服务端生成的临时公钥通过 KeyShare 消息发送给客户端;
客户端接收到 KeyShare 消息后, 使用证书公钥进行签名验证, 获取服务器端的 ECDH 临时公钥, 生成会话所需要的共享密钥;
双方使用生成的共享密钥对消息加密传输, 保证消息安全
如果客户端之前已经连接, 我们有办法在 1.2 中进行 1-RTT 连接, 而在 TLS 1.3 中允许我们执行 0-RTT 连接, 如图所示:
需要说明的是, 如需查看 TLS 1.3 的报文, 需要使用 2.5 版本的 wireshark, 可以去 https://www.wireshark.org/download/automated/ 下载
TLS 1.3 的新特性
1. 废除不支持前向安全性的 RSA 和 DH 密钥交换算法;
2.MAC 只使用 AEAD 算法;
3. 禁用 RC4 / SHA1 等不安全的算法;
4. 加密握手消息;
5. 减少往返时延 RTT, 支持 0-RTT;
6. 兼容中间设备 TLS 1.2;
7. 加密握手消息:
TLS1.2 及之前版本的协议中各种扩展信息在 ServerHello 中以明文方式发送, 但是 TLS 1.3 协议要求 ServerHello 消息之后的握手信息都需要加密
tls1.2
tls1.3
浏览器支持 TLS 1.3
目前最新的 Chrome 和 Firefox 都支持 TLS 1.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;
web 服务器支持 TLS 1.3
首先, 需要下载 openssl 开发版, 目前 TLS 1.3 还处于 draft 版, 所以要克隆其分支进行编译
- git clone -b tls1.3-draft-18 --single-branchhttps://github.com/openssl/openssl.git
- openssl
注意: github 的最新版本 tls1.3-draft-19 编译后并不会有效果
以 nginx 1.13.8 为例 (自 1.13.0 开始 nginx 开始支持 TLSv1.3), 在编译的时候加上
--with-openssl=../openssl --with-openssl-opt='enable-tls1_3 enable-weak-ssl-ciphers'
例如我的编译参数
./configure --prefix=/usr/local/nginx --user=www --group=www --with-pcre=/opt/nginx/pcre-8.41 --with-http_ssl_module --with-zlib=/opt/nginx/zlib-1.2.11 --with-http_v2_module --add-module=../nginx-ct-1.3.2 --add-module=../ngx_brotli --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
编译完成停止你的 nginx 进程, 在 nginx 目录执行如下命令
cp -rf ./objs/nginx /usr/local/nginx/sbin/
在你的 nginx 配置文件中添加如下配置
- ssl_protocols TLSv1.2 TLSv1.3; #增加 TLSv1.3 重启 nginx 服务
- 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;
CDN 支持 TLS 1.3
目前, 又拍云的 CDN 网络已经率先支持 TLS 1.3, 你可以在又拍云的控制台中开启
开启路径: CDN 功能配置 HTTPS TLS1.3
开启后通过浏览器访问可以看到协议版本
来源: https://www.cnblogs.com/upyun/p/8508126.html