图说TCP/IP协议(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等协议, 除了给应用层协议提供安全性保证外, 还有就是可以用于VPN,例如SSL VPN。

    另外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体系,见下一篇SSL/TLS数据传输的安全保障

    通过此过程,客户端和服务器都会相互信任对方。

2.3. 对称加密密钥种子参数交换

    SSL/TLS支持密钥交换算法由RSA、DH、DHE、ECDH、ECDHE,见SSL/TLS数据传输的安全保障

    通过此过程,客户端和服务器就会产生一个一模一样的密钥,也就是我们所说的对称加密密钥,用于加密传输的数据。

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是通过以下过程,来完成数据传输被篡改的问题,具体见下一篇SSL/TLS数据传输的安全保障

    (1)Client --> Server:Client Encrypted Handshake Message

    (2)Server--> Client:Server Encrypted Handshake Message

猜你喜欢

转载自blog.csdn.net/Wendy019900107/article/details/89813457