科普 TLS 1.3—新特性与开启方式
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.gitopenssl
注意: 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

开启后通过浏览器访问可以看到协议版本。

推荐阅读:
科普 TLS 1.3—新特性与开启方式的更多相关文章
- 让互联网更快,Server Push 特性及开启方式详解
		
过去 Nginx 并不支持 HTTP/2 的 Server Push 特性,幸运的是 Nginx 1.13.9 已支持该特性,详情介绍请移步 Nginx 官方博客. Server Push 这个特性是 ...
 - Perl的新特性开启
		
1.perl自从5.8开始,新特性需要开启才可以使用,默认只是5.8版本,而不管当前你使用的是那个版本. 2.开启新特性,当然最高可用版本是你实际安装的版本,假设你安装的是v5.26版 ; #或者这样 ...
 - ECMAscript6(ES6)新特性语法总结(一)
		
ES6/ES2015,,在ES5的基础上扩展了很多新的功能,在使用的时候要慎重,因为有一部分js代码在部分浏览器是不兼容的,但是所有写在服务器端的代码基本上都支持ES6的写法. 新特性: 一.开启严格 ...
 - Java 8 新特性——Lambdas 表达式
		
本文内容 引入 测试数据 collect(toList()) map filter flatMap max 和 min reduce 整合操作 参考资料 Java 8 对核心类库的改进主要包括集合类的 ...
 - C++2.0新特性(一)——<特性认知、__cplusplus宏开启、Variadic Templates 、左右值区分>
		
一.新特性介绍 2.0新特性包含了C++11和C++14的部分 1.2 启用测试c++11功能 C++ 标准特定版本的支持,/Zc:__cplusplus 编译器选项启用 __cplusplus 预处 ...
 - Node 12 值得关注的新特性
		
前言 时隔一年,Node.js 12 如约而至,正式发布第一个 Current 版本. 该版本带来了诸如: V8 更新带来好多不错的特性. HTTP 解析速度提升. 启动速度大幅提升. 更好的诊断报告 ...
 - iOS6、7、8、9新特性汇总和适配说明
		
iOS6新特性 一.关于内存警告 ios6中废除了viewDidUnload,viewWillUnload这两个系统回调,收到内存警告时在didReceiveMemoryWarning中进行相关的处理 ...
 - Java 8 新特性概述
		
Oracle 在 2014 年 3 月发布了 Java 8 正式版,该版本是一个有重大改变的版本,对 JAVA 带来了诸多新特性.其中主要的新特性涵盖:函数式接口.Lambda 表达式.集合的流式操作 ...
 - 迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上)【转载】
		
转自: DBAplus社群 http://www.toutiao.com/m5762164771/ 迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上) - 今日头条(TouTiao.com ...
 
随机推荐
- ClearCase  config_spec
			
1.使用分支前要在vob创建branch type,Config_Spec不能自动创建branch type: 2.如果可能,最好在以前确定的label上进行新的工作,避免维护复杂的config_s ...
 - Nginx的安装(笔记)
			
0, 先决条件Nginx 依赖 zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre安装命令:yum -y install make z ...
 - java中的 private Logger log=Logger.getLogger(this.getClass());
			
this.getClass()得到什么? this 表示当前对象的引用: getClass() 是 java.lang.Object 中的方法,它返回一个对象的运行时类: this.getClass( ...
 - 在nagios中监控windows主机系统地址的状态
			
原来的[root@nhserver2_5 objects]# cd /usr/local/nagios/etc/objects[root@nhserver2_5 objects]# vim comma ...
 - JS对象、原型链
			
忘记在哪里看到过,有人说鉴别一个人是否 js 入门的标准就是看他有没有理解 js 原型,所以第一篇总结就从这里出发. 对象 JavaScript 是一种基于对象的编程语言,但它与一般面向对象的编程语言 ...
 - 完全总结bash中的条件判断test [ [[ 使用
			
在bash脚本编程中,我们经常做一些条件判断, 我们主要用到了三种,test,单中括号,双中括号 经常有看到不同的写法,如: [ $? –eq ] [[ $myvar == “mysql” ]] te ...
 - Kafka Producer Consumer
			
Producer API org.apache.kafka.clients.producer.KafkaProducer props.put("bootstrap.servers" ...
 - Using Custom Domains With IIS Express In Asp.Net Core
			
IIS Express是一个Mini版的IIS,能够支持所有的Web开发任务,但是这种设计有一些缺陷,例如只能通过localhost:<port>的方式来访问我们的应用程序,看起来就有点不 ...
 - JdbcTemplate的使用
			
NamedParameterJdbcTemplate中包含了一个JdbcTemplate,NamedParameterJdbcTemplate中的很多方法实际上还是交由JdbcTemplate去完成. ...
 - JDBC学习笔记(四)
			
减少各个Dao类间的重复代码,有以下几种方式: 写一个DBConnectionManager,将公共的查询逻辑做成方法,将sql语句作为参数传递给方法. public class DBConnecti ...