网络协议安全:SSL/TLS协议详解,SSL协议执行原理、报文格式解析,Wireshark抓包分析SSL协议

发布于:2024-04-19 ⋅ 阅读:(30) ⋅ 点赞:(0)

「作者简介」:2022年北京冬奥会中国代表队,CSDN Top100,学习更多干货,请关注专栏《网络安全自学教程》

SSL(Secure Socket Layer)是「安全套接层协议」,在握手过程中使用非对称秘钥加密实现数据的机密性;使用哈希算法实现数据的完整性。

1、SSL协议发展史

SSL3.1开始名字改成了TLS,TLS在SSL的基础上进行了「标准化」,实际上两个协议的功能没有明显的差距。

SSL1.0 SSL2.0 SSL3.0 SSL3.1 SSL3.2 SSL3.3 SSL3.4
TLS1.0 TLS1.1 TLS1.2 TLS1.3
内部 弃用 弃用 可用 可用 主流 可用
  1. SSL1.0:网景(Netscape)公司开发的第一个版本,由于存在严重bug,仅在内部使用。
  2. SSL2.0:1995年2月发布,存在安全漏洞,于2011年弃用。
  3. SSL3.0:1996年发布,容易被POODLE攻击,与2015年弃用。
  4. TLS1.0:1999年发布,IETF组织在SSL基础上进行了标准化,功能变化不大。
  5. TLS1.1:2006年4月发布,修复了安全漏洞,增加加密强度。
  6. TLS1.2:2008年8月发布,强化了支持的算法包,增加了扩展协议,是目前使用的主流版本。
  7. TLS1.3:2018年8月发布,在强化安全性的同时,引入了0-RTT模式,降低了传输延迟,增强了传输性能

2、SSL协议执行过程

SSL协议分为两层:

  • 第一层是「SSL记录协议」(SSL Record Protocol),工作在传输层协议之上,为高层协议封装、压缩、「加密数据」
  • 第二层是「SSL握手协议」(SSL Handshake Protocol),工作在记录协议之上,在数据传输前通过握手的方式验证身份、「协商加密算法」

补充:第二层一共有4种子协议,多个子协议信息可以包含在一个记录协议的数据包里,但必须标识出来。除了握手协议还有三个需要了解的协议:密码参数协议、警报协议、应用数据协议。

  • 密码参数协议(ChangeCipherSpec Protocol):这个协议很简单,简单到只有一条消息,就是发出激活加密的信号,让之前协商的参数生效,从而让通信变得加密。
  • 警报协议(Alert Protocol):提示异常或可能危及安全性的潜在为题。
  • 应用数据协议(Application Data Protocol):获取应用层的数据并加密传输。

在这里插入图片描述

SSL协议执行的时候分为两个阶段:

  1. 第一个是「握手阶段」,通信双方使用SSL握手协议协商加密算法和密钥。
  2. 第二个是「数据传输阶段」,使用握手阶段协商的算法加密并传输数据。

在这里插入图片描述

SSL协议的握手过程如下图

在这里插入图片描述

接下来我们详细讲解每个握手阶段作用:

  1. Client Hello :客户端把支持的加密算法列表发给服务器。
  2. Server Hello :服务器从列表里选择一个加密算法,然后告诉客户端。
  3. Certificate :服务器把自己的证书发给客户端。
  4. Server Key Exchange :服务器跟客户端约定对称密钥算法的密钥。如果使用Diffie-Hellman方式约定密钥,则必选;如果使用RSA方式约定密钥,则省略。
  5. Server Hello Done :告诉客户端 “我发完了”。
  6. Client Key Exchange:客户端跟服务器约定对称密钥算法的密钥。如果使用Diffie-Hellman方式约定密钥,则发送必要的信息给服务器,让服务器和客户端生成同一个密钥;如果使用RS方式约定密钥,则生成一个对称密钥算法的密钥,用服务器的公钥加密后,发送给服务器。
  7. ChangeCipherSpec:客户端告诉服务器 “你可以使用加密模式了”。
  8. Encrypted Handshake Message:也叫Finished,客户端告诉服务器 “我准备好加密通信了”。
  9. ChangeCipherSpec:服务器告诉客户端 “你可以使用加密模式了”。
  10. Encrypted Handshake Message:也叫Finished,服务器告诉客户端 “我准备好加密通信了”。

上面的过程是单向认证模式,比较常见;如果使用双向认证模式,握手还会增加以下过程:

在这里插入图片描述

  • Certificate Request (可选):开启双向认证模式,即客户端验证服务器,服务器也要验证客户端。https的网站很少用,一般抓不到这个包。
  • Certificate(可选):发送客户端的证书给服务器。只有收到 Certificate Request 才发,否则不发这个报文。
  • Certificate Verify (可选):把客户端的签名发给服务器,服务器用客户端的公钥验证签名,从而验证客户端的身份。只有收到 Certificate Request 才发,否则不发这个报文。

3、SSL报文格式字段解析

3.1、TLS报文头

每个TLS的数据包都有5个字节的报文头(下图圈中的地方):

  • Content Type:1个字节,记录的子协议的协议类型。
  • Version:2个字节,TLS的版本。
  • Length:2个字节,报文数据的长度(不含报文头),最大16384(16K)。

在这里插入图片描述

3.2、Handshake报文

Handshake 握手协议是TLS中最复杂的协议,有10种握手消息类型。

1)HelloRequest:(不常见)连接使用太长时间后,服务器强制客户端重新协商握手。

  • Content Type:握手类型。
  • Length:(3个字节)数据长度。

2)Client Hello:开始握手协商,携带客户端支持的加密算法列表、压缩算法列表、扩展列表,供服务器选择。

在这里插入图片描述

  1. Content Type:握手类型。
  2. Lengt:(3个字节)数据长度。
  3. Version:(4个字节)协议版本。
  4. Random:(32位)客户端生成一个随机数,用于后续的对称加密。
  5. Session ID Lenth:(1个字节)会话ID长度。
  6. Session ID:(32位)会话ID。
  7. Cipher Suites:客户端支持的加密算法列表,供服务器选择。
  8. Compression Methed:客户端支持的压缩算法,供服务器选择。
  9. Extensions:扩展。

3)Server Hello:开始握手协商,返回服务器选择的加密算法、压缩算法。

在这里插入图片描述

  • Content Type:握手类型。
  • Lengt:(3个字节)数据长度。
  • Version:(4个字节)协议版本。
  • Random:(32位)服务器生成一个随机数,用于后续的对称加密。
  • Session ID Lenth:(1个字节)会话ID长度。
  • Session ID:(32位)会话ID。
  • Cipher Suites:服务器选择的加密算法。
  • Compression Methed:服务器选择的压缩算法。
  • Extensions:扩展。

4)Certificate:发送公钥证书列表。

在这里插入图片描述

  • Content Type:握手类型。
  • Lengt:(3个字节)数据长度。
  • Certificates Length:证书列表长度。
  • Certificates:证书列表。

5)ServerKeyExchange:发送服务器的密钥交换算法参数,用于后续的对称加密。

在这里插入图片描述

  • Content Type:握手类型。
  • Lengt:(3个字节)数据长度。
  • algorithm params:算法参数。

6)CertificateRequest:服务器验证客户端身份,不常见。

  • Content Type:握手类型。
  • Lengt:(3个字节)数据长度。
  • Certificate Type Length:证书类型长度。
  • Certificate Type:证书类型。
  • Certificate Authorities length:认证中心长度。
  • Certificate Authorities:认证中心。

7)ServerHelloDone:服务器完成握手协商时发送。只提示,不携带其他信息。

在这里插入图片描述

  • Content Type:握手类型。
  • Lengt:(3个字节)数据长度。

8)ClientKeyExchange:为服务器提供密钥交换算法参数,用于生成对称加密的密钥。

在这里插入图片描述

  • Content Type:握手类型。
  • Lengt:(3个字节)数据长度。
  • algorithm params:算法参数。

9)CertificateVerify:客户端使用此消息来证明服务器拥有与其公钥证书相对应的私钥。该消息保存由客户端进行数字签名的哈希信息。

  • Content Type:握手类型。
  • Lengt:(3个字节)数据长度。
  • signed hash:客户端数字签名的哈希信息。

10)Finished:也叫Encrypted Handshake Message,标识握手协商已完成、CipherSuite加密已激活。从这个报文开始加密发送,报文携带先前所有握手信息的哈希值,用来验证数据的完整性,防止数据被篡改。

在这里插入图片描述

  • Content Type:握手类型。
  • Lengt:(3个字节)数据长度。
  • signed hash:先前所有握手信息的哈希值。

4、Wireshark抓包分析SSL协议执行原理

1)cmd 中 ping weibo.com 获取微博IP;

ping返回的地址有时会变,用 nslookup weibo.com 解析微博的IP;

解析列表中的4个IP,我们都抓,以防IP变动导致没抓到包。

在这里插入图片描述

2)打开wireshark,过滤微博的IP _ws.col.protocol == "TLSv1.2" and (ip.addr==123.125.107.13 or ip.addr==123.125.107.14 or ip.addr==202.108.0.99 or ip.addr==202.108.0.98) 后,开启抓包,访问微博。

在这里插入图片描述

3)从抓包结果可以看出来,前几个包是握手,握手完成以后才开始传数据。

在这里插入图片描述

4)握手有10个过程,一个数据包可以包含多个握手过程,比如第三个包,就同时包含了Certificate、Server Key Exchange、Server Hello Done三个过程。

在这里插入图片描述

4.1、Client Hello

第一个包是我给微博发的 Client Hello,意思是我要开始握手协商了。

在这里插入图片描述

Handshake Type 是握手类型,这里的类型是Client Hello。
Length 和 Version是数据包长度和协议版本。

Random 是客户端生成的随机数,用来生成对称密钥。
Session ID 是会话ID,短期内重复连接时,会话可以复用。

Cipher Suites 是客户端支持的加密算法,服务器可以从这个列表里选择它认为最安全的一个算法,后续用来加密数据。

Compression Methods 是客户端支持的压缩算法。
Extensions 是一些扩展。

4.2、Server Hello

第二个包是微博给我返回的 Server Hello,意思是它也要跟我开始握手,协商加密参数。

在这里插入图片描述

Cipher Suite是服务器选择的加密算法,握手完成后会用这个算法加密数据。

Compression Method 是服务器选择的压缩算法,这里是null,说明没选,数据不被压缩。