上回书说到,密码学是作为TLS的基础,为协议的运作提供了牢固的理论体系,而本次我们就正式揭开TLS的面纱,像素级的观察这个神秘协议的运行机理。 我们采用理论结合实践的方法来介绍协议细节。正所谓:大牛养成之路,关键不在“学”,而在“干”——实践出真知。
TLS版本演进时间线
知历史知兴替,先来了解下TLS的前世今生(答应我,这之后就别再问SSL和TLS是啥关系了好吗)。
TLS前身是网景(Netscape)公司开发的SSL规范,后来在协议维护移交给IETF之后,将其更名为TLS,正如罗马不是一天建成,TLS发展的过程中也经历了很多曲折:
1、 SSL 1.0仅是网景内部版本,由于严重Bug,从未公开发布;
2、 SSL 2.0 发布于1995年2月,同样存在一些安全漏洞,已于2011年废弃;
3、 SSL 3.0 发布于1996年,经过完全重新设计,也是一度广泛使用的版本,但由于易遭臭名昭著的POODLE攻击,同样在2015年已被废弃;
4、 TLS 1.0,发布于1999年1月,为协议从网景移交到IETF后的第一个版本,该版本变化并不大,已于2020年被废弃;
5、 TLS 1.1,发布于2006年4月,修复了安全漏洞,增强加密强度,同样于2020年被废弃;
6、 TLS 1.2,发布于2008年8月,强化了支持的算法包,增加了扩展定义,也是目前的使用的主流版本;
7、 TLS 1.3,发布于2018年8月,在强化安全性的同时,引入了0-RTT模式,降低了传输延迟,增强了传输性能。
TLS 1.3协议发布距TLS 1.2 版本发布已有十年时间,期间互联网需求及密码学都发生了翻天覆地的变化,经过长时间需求累计和修订,此版本相较之前版本,无论是性能还是安全方面都可谓是有了较大的发展,因此本文主要针对TLS1.3版本进行介绍。
TLS 1.3 详解及Wireshark抓包分析
首先,让我们先通过一张图来展示下TLS 1.3带来的优越性。
图片来源于网络
通过理论分析及实际测试显示,由于TLS 1.3简化了握手协议的交互流程,握手延迟较TLS 1.2缩短近三分之一,性能也得到相应提升。
1. TLS 1.3协议层级架构
在网络领域,为了实现解耦基本都遵循了层级软件架构,TLS协议位于下层TCP协议及上层(即应用层)协议之间。
Tips:由于TLS对交互信息的时序有规定,所以下层协议必须能够提供这种时序服务,因此TLS不能使用UDP来传输。针对UDP的安全应用场景,可参照DTLS规范。
同样在TLS协议内部也是基于分层架构,分为两层:下层为记录层协议,为TLS上层子协议为传送提供分片、消息加密及加密后报传输,同时对接收到的数据进行验证、解密、重新组装,然后提交给高层的应用层;上层包含4种子协议:握手协议(Handshake Protocal)、警报协议(Alert Protocol)、应用数据协议(Application Protocol)及Change_cipher_spec。其中change_cipher_spec只是为了兼容性存在,其余每个子协议都具有特定的作用,组合起来实现完整的协议功能。
下面我们就分别对各个子协议进行介绍。
2. Handshake Protocol
首先最重要的(对就是firstandforemost)是握手协议,也是理解整个TLS协议的重点与难点,我们将着重对其进行介绍。握手协议如字面所言,是在加密通信之前,对于加密使用的算法套件及加密密钥进行协商,这和在两个陌生人开始聊天前,通常都需要礼节性的握手类似。这个握手协议凝聚了整个密码学的精华,其中的每一步都是经过了密码学严格论证,有很多实现上容易出错的“坑”。为了便于理解,按照先前的比喻,我们先模仿两个陌生人对话的逻辑(这里这两个陌生人可能交流一些“学习.hub”等私密的话题)来梳理下整个交互过程,同时用黑体字注明了对应的握手协议消息类型。
(1) C(Client):你好呀,怕别人偷听,我准备用只有我俩能听懂的语言来聊天,你看我会这几种类型语言,你愿意用那种呢?
—ClientHello
(2) S(Server):你好呀,我波西米亚语比较6,要不我们就用这种?
—ServerHello
(3) S:你谁呀?我就和你讲这么秘密的事情,把你的身份证给我看看?
—CertificateRequest
(4) S:对了,这是我的身份证。
—Certificate
(1) S:为了证明我是我,我把咱两这句话之前的聊天记录签了个名,一并发给你。
—CertificateVerify
(2) S:我这边准备好了,我用波西米亚语把咱两这句话之前的聊天又重说了下,你能听懂吧?
—Finish
(3) C:这是我的身份证。
—Certificate
(4) C:同样为了证明我是我,我也把咱两这句话之前的对话也签了个名,发给你了。
—CertificateVerify
(5) C:我也准备好了,我用波西米亚语把咱两这句话之前的所有聊天对话又重说了下,你能听懂吧?
—Finish
最后,两个人终于商量好了,可以做一些有趣的事了。
又有人问了,那你之前说的0-RTT是啥呢?这里面也没提到啊?这里RTT(Round-Trip Time)是通信往返距离,而0-RTT就是指在客户端通过ClientHello通信时就可以附带传送一些数据。这就像你俩已经聊过天了,在上次聊天中,约定好了以后聊天时使用的方式。在下次聊天时就能直接用商量好的方式来直接聊天,不用再麻烦交换身份证之类的繁文缛节了。
上面的例子可能看起来没啥,大家可能会觉得风轻云淡,但其实这里面暗藏玄机,正所谓静水流深;这个过程中,几乎用全了密码学工具箱的内容,一点微小的错误就可能使安全传输土崩瓦解,我们试着总结梳理如下:
1、 通过ClientHello及ServerHello完成了随机数、加密算法包及证书格式的协商,重点完成了密钥参数的传输
2、 通过Certificate及CertificateVerify应用证书体系及数字签名完成身份认证
3、 通过AEAD对称加密算法,完成握手消息中数据加密
再把水搅浑点,事实上,握手阶段中的一些消息也都是经过加密的,而且在握手阶段使用的加密密钥同应用数据传输时使用的加密密钥是不同的。俗话说,一图胜千言,话不多说,直接看图:
图片来源于网络
握手阶段中,在ClientHello及ServerHello后,通信的双方已经就加密算法包及参数达成了一致,在这之后的消息TLS 1.3协议也规定需对其进行加密。这也是TLS 1.3协议加强其安全性的一大举措。TLS 1.3协议中设计有专门的密钥计算算法,针对如何生成不同阶段密钥进行了规定。
这么解释还是有点雾里看花,下面我们就通过Wireshark截取报文来切身体会下实际网络交互中的握手协议。
ClientHello消息
ServerHello消息
Certificate消息
CertificateVerify消息
Finish消息
0-RTT模式
3. Alert Protocol
报警协议也如字面含义所示,是用来指示关闭信息和错误信息的,相应的主要包含两大类:关闭警报和错误警报。这部分内容相对简单,我们可用一幅思维导图来整体梳理下相关知识。
4. Record Protocol
如上面综述所言,记录层位于TLS内部下层,主要负责验证、分片/重组、加密/解密的任务。大家可能对其中一些概念不熟悉,让我们来解释下各个作用的含义:
a) 加密/解密:这个就比较显而易见了,不做过多解释;
b) 分片/重组:这里的分片不是由于下层协议的帧长度限制的,而是因为解密方需要收完整个record,才能解密。长度过长会导致解密方需要等待更多的RTT,增大延迟,破坏用户体验,因此TLS协议规定length必须小于 2^14字节;
c) 验证:这部分内容涉及比较多,包括报文时序是否满足协议规定,AEAD中的消息认证是否正确,填充是否正确等内容。
让我们以一个真实截获的加密数据报文来结束Record层分析。
5. TLS 1.3的重要改进
最后我们来总结下,TLS 1.3引入的一些重要改进,如果还有不知道的术语,就去快翻翻上篇《传输层安全协议TLS——密码学概述》吧。
1. 对原有的对称算法列表进行调整,只支持使用带有关联数据的认证加密(AEAD)算法;—增强安全性
2. 以牺牲某些安全属性为代价添加了零RTT(0-RTT)模式,节省了特定场景下应用程序数据的连接建立的往返时间;—减少延迟,提升性能
3. 静态RSA和Diffie-Hellman密码套件已被删除;所有基于公钥的密钥交换机制现在都提供前向保密性;—增强安全性
4. ServerHello之后的所有握手消息都进行加密;—增强安全性
5. 重新设计密钥派生函数,用基于HMAC的密钥提取和密钥扩展函数(HKDF)作原语;—规范密钥生成算法
6. 重组握手状态机使其更加前后一致,并移除了多余的消息;—提升性能
7. 压缩,自定义DHE组和DSA已被删除。—压缩可能带来安全风险已被删除,增强安全性
TLS协议涉及面广,背后的密码学理论坚深,短短两篇推文并不能穷尽各个知识点。其在车载领域的应用,包括如何在AUTOSAR CP/AP建模中的应用及如何在CANoe中开展仿真分析,如何使用OpenSSL生成证书,嵌入式环境中有哪些开源实现等等一系列的问题尚未涉及,如果有小伙伴对这些内容感兴趣,就在评论区留言吧!