例说图解TCP/IP协议族--TLS篇(1)抓包分析SSL/TLS握手
SSL是Secure Sockets Layer (安全套接层)的简写,SSL协议是为网络通信提供安全的一种安全协议,继任者为TLS,即 Transport Layer Security传输层安全。
1. 初识SSL/TLS
1.1. SSL/TLS协议版本
SSL的版本如下图所示, 可以看到从SSLv3.1以后,名称都改为TLS。
SSL版本 | SSLv2 | SSLv3 | SSLv3.1 | SSLv3.2 | SSLv3.3 | SSLv3.4 |
TLS版本 | TLS1.0 | TLS1.1 | TLS1.2 | TLS1.2 | ||
使用情况 | 淘汰 | 淘汰 | 不建议使用 | 在用 | 建议使用 | 将来使用 |
1.2. SSL/TLS协议与OSI模型
SSL协议位于OSI七层模型的第五层和第六层, 底层为传输层的TCP协议, 上层为HTTP、SIP....等应用层协议.
SSL协议自身可分为两层, SSL记录协议和SSL握手协议/SSL告警协议/SSL加密参数修改协议, 如下图所示。
记录协议为高层协议提供数据封装、压缩、加密等基本功能的支持.
握手协议建立在记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加***等.
告警协议也是建立在记录协议之上, 用于在通信双方出现异常时使用.
加密参数修改协议也是建立在记录协议之上, 用于明确指出通信双方从非对称加密切换到对称加密, 不过该协议在TLS1.3中被废除.
1.3. SSL/TLS协议的应用场景
从上图可以看到TLS协议中的应用层数据有HTTP, 当然除了HTTP外,还可以是SIP、 SMTP、POP等协议, 除了给应用层协议提供安全性保证外, 还有就是可以用于v*n,例如SSL v*n。
另外TLS协议底层除了是TCP外,还可以是EAP,这点在网络准入里面的EAP-TLS、 EAP-TTLS、EAP-PEAP里面可以看到。
当然了,最开始TLS协议的设计初衷是保证TCP的数据安全性,其实现在还有位于UDP协议上的TLS协议,那就是DTLS协议。对于此协议可能做无线的同学比较熟悉, 在无线通信中的瘦AP和AC之间的通信协议CAPWAP就是采用DTLS协议来保证数据的安全传输。
2. SSL/TLS握手
讲SSL/TLS协议,握手过程是必不可少的。不过在这之前需了解,由于SSL/TLS的版本问题,对称**交换算法问题、单证与双证的问题,SSL/TLS握手报文是不一样的,不过大同小异。本文以TLS1.2为例来讲解。
如下图所示,该场景是我在浏览器输入路由器的URI【https://10.74.97.126】,用wireshark抓包,这是一个完整的TLS1.2的握手过程。
可以看到前三个报文为TCP的三次握手,SYN、SYN/ACK、ACK,用于为TLS建立连接,这是所有基于TCP的上层协议所必需经历的阶段。接下来才是SSL/TLS的握手过程。
可以看到TLS的握手报文还是很多的,我们可以通过记忆握手完成的工作,来记忆SSL/TLS握手报文。SSL/TLS手过程要完成的工作,按照先后顺序来讲,依次是:
(1)版本、算法以及其他参数的协商:Client Hello,Server Hello
(2)认证:Server Certificate,Client Certificate Request、Client Certificate、Certificate Verify【双证时出现】
(3)对称加***种子参数交换:Server Key Exchange【DH交换时出现】,Client Key Exchange
(4)改变加密方式从非对称加密到对称加密:Client Change Cipher Spec,Server Change Cipher Spec
(5)完整性保证:Client Encrypted Handshake Message,Server Encrypted Handshake Message
(6)真正数据的传输:Client Application Data、Server Application Data
在SSL/TLS握手过程中,有些数据加密,有些没加密,有些是非对称加密,有些是对称加密,下面详细指出。
报文 | 加密方式 | 说明 |
(1)(2) | 不加密 | 不怕被第三方知道 |
(3) | 非对称 |
前面已经相互交换了证书,证书里包含了公钥,所以具备公钥加密的条件; 另外由于该部分传输的是对称加***的种子参数,不能被外界知晓,所以这也是加密的必要性 |
(4) | 不加密 | 不怕被第三方知道 |
(5)(6) | 对称加密 |
前面双方已经生成了一样的对称加***,也协商出使用的对称加密算法,因此具备了对称加密的条件; 至于必要性,就不用讲了吧; 为何不用公钥加密,原因是公钥加密很慢,加密少量数据没有问题,大量数据就得用对称加密了 |
2.1. 版本、算法以及其他参数的协商
(1)我们展开Client Hello包,如下图所示
Client Hello报文里面携带的参数很多很多,我们重点关注以下几个:
1)客户端支持的版本号:位于Record Layer -- Version:TLS1.0 到 Client Hello -- Version:TLS1.2
2)客户端支持的加密套件:位于Client Hello:Cipher Suites Length(56)和Cipher Suites(28 suites)
3)客户端支持的压缩算法:没见用过,压缩基本由应用层来完成
4)客户端支持的应用层协议:位于Extension:ALPN,本例支持HTTP/2和HTTP/1.1
5)客户端支持的签名算法:位于Extension:signature_algorithms
(2)我们展开Server Hello包,如下图所示
从上图可知,当服务器收到Client Hello后,会从中选出自己支持的参数告诉客户端。如本例中的
1)SSL/TLS版本:TLS1.2
2)加密套件:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
(3)如何理解 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
字段 | TLS | ECDHE | RSA | WITH | AES_256_GCM | SHA384 |
解释 | 代表TLS协议 | 对称加***交换算法 | 非对称**算法,也就是公钥/私钥算法 | 分割作用 | 对称加密算法 | 哈希算法 |
当然了不同的SSL/TLS版本、不同的客户端、不同的服务器支持的这些算法各有不同,下面列出一些常用的算法。
1)**交换算法:RSA、DH、DHE、ECDHE
2)非对称加密算法:RSA、DSA、ECDSA
3)对称加密算法:DES、3DEC、AES_128_GCM、AES_128_CCB、AES_256_GCM、AES_256_CBC
4)哈希算法:MD5、SHA1、SHA256、SHA384
2.2. 认证
SSL/TLS是基于证书来做认证的,采用了PKI体系,见下一篇。
通过此过程,客户端和服务器都会相互信任对方。
2.3. 对称加***种子参数交换
SSL/TLS支持**交换算法由RSA、DH、DHE、ECDH、ECDHE,见下一篇。
通过此过程,客户端和服务器就会产生一个一模一样的**,也就是我们所说的对称加***,用于加密传输的数据。
2.4. 改变加密方式从非对称加密到对称加密
当版本、加密算法等参数协商完成、认证通过、对称加密的**生成后,通过以下过程,完成加密方式的改变。
1)Client --> Server:Client Change Cipher Spec
2)Server--> Client:Server Change Cipher Spec
在这之前双方是非对加密传输SSL/TLS握手的有关数据,在这之后双方是对称加密数据,包括完整性保证的数据和真正的通信数据。
另外要注意一点的是,Change Cipher Spec不像Client Hello、Server Hello等是封装在 Handshake Protocol层,而是同Handshake Protocol一样,直接封装在TLS Record Layer层。
2.5. 完整性保证
随着加密方式的切换,也预示着SSL/TLS握手的结束,不过在这之前,还有一个问题需要考虑。前面我们详细讨论了通讯双方的身份信任问题、数据加密传输防窃听的问题,但是数据传输被篡改的问题,我们并没有讨论。
其实SSL/TLS是通过以下过程,来完成数据传输被篡改的问题,具体见下一篇。
(1)Client --> Server:Client Encrypted Handshake Message
(2)Server--> Client:Server Encrypted Handshake Message