科普 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.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
开启后通过浏览器访问可以看到协议版本。
推荐阅读:
科普 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 ...
随机推荐
- Servlet--ServletException类,UnavailableException类
ServletException类 定义 public class ServletException extends Exception 当 Servlet 遇到问题时抛出的一个异常. 构造函数 pu ...
- Inner Join and Left Join 与条件的结合
在使用关系数据库时,表连接和对结果集的筛选是必不可少的查询技能,对于他们的用法你都搞清楚了么?请让我们一起来过一遍. 表创建与初始化: Inner Join 结果集: 对于Inner Join, 条件 ...
- MoonLight可视化订单需求区域分析系统前端
MoonLight可视化订单需求区域分析系统实现功能: 在现实生活中,计算机和互联网迅速发展,人们越来越趋向于网络,于是我们就有了各种各样的系统,来帮助我们更好地生活.比如对于打车来说,我们也可以通过 ...
- MySQL中查询表及索引大小的方法
查询MySQL表的大小及索引大小可以通过系统库information_schema中的TABLES表来实现. 该表常用的一些字段: TABLE_SCHEMA:数据库名TABLE_NAME:表名ENGI ...
- MySQL存储过程中declare和set定义变量的区别
在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...
- zabbix action理解
Maintenance status not in maintenance 谷歌翻译:维护状态不在维护中,中文意思就是监控的设备有problem,触发器报警了,然后执行action {TRIGGE ...
- Array.prototype鲜为人知的事实
// constructor 属性是每个具有原型的对象的原型成员. // 这包括除 Global 和 Math 对象之外的所有内部 JavaScript 对象. // constructor 属性包含 ...
- Python随笔,day1
#python中不存在单个字符的运算,只有字符串函数 >>> s="www.google.com" >>> s 'www.google.com' ...
- 如何实现Selenium自动化读取H5手机缓存
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6890675.html 前言: 由于Se ...
- python学习--Linux下dlib安装(主要是cmake和boost的安装)
昨天我们使用了dlib和opencv进行了人脸检测标注(http://www.cnblogs.com/take-fetter/p/8310298.html) 但是运行环境是基于windows的而且可能 ...