SSL/TLS介绍以及wireshark抓包TLS Handshake报文

news/2025/2/23 0:17:12/

文章目录

    • 1.概念
      • 1.1 SSL/TLS发展历史
      • 1.2 TLS两个阶段
      • 1.3 TLS报文头
    • 2.TLS Handshake
      • 2.1 Handshake具体过程
        • 2.1.1 单向认证和双向认证
        • 2.1.2 复用TLS协商结果
          • Session Identifier(会话标识符)
          • Session Ticket(会话票据)
      • 2.2 Handshake报文格式
    • 3. wireshark抓取TLS报文
      • 3.1 第一次握手
      • 3.2 第二次握手
      • 3.3 第三次握手
      • 3.4 第四次握手

1.概念

SSL(Secure Sockets Layer)和TLS(Transport Layer Security)是一种安全协议,用于在计算机网络上实现加密通信。SSL最初由美国Netscape开发,随后发展为TLS,并得到了广泛应用,成为互联网上保护通信安全的标准协议。

TLS 位于 TCP 之上(也有基于 UDP 的,称为DTLS,这里不讨论它),如图所示。
在这里插入图片描述

SSL/TLS是在应用层和传输层之间的一个安全协议,通信的双方在进行通信前需要握手,通过在通信的两端建立一个安全的通道,保护数据在传输过程中的安全性。以下是SSL/TLS提供的几个重要的安全功能:

  1. 机密性(Confidentiality): SSL/TLS使用加密算法对数据进行加密,防止未经授权的第三方窃取和读取敏感信息。只有身份验证通过的终端才能解密数据。
  2. 完整性(Integrity): SSL/TLS使用消息认证码(MAC)或哈希函数来确保数据在传输过程中没有被篡改或损坏,接收方可以验证数据的完整性,确保数据在传输期间没有被篡改。
  3. 身份验证(Authentication): SSL/TLS提供了一种机制,用于验证通信的两端的身份。这可以防止中间人攻击和伪造身份的风险。通常使用数字证书来验证服务器和客户端的身份。
  4. 抗重放攻击(Resistance to Replay Attacks): SSL/TLS使用时间戳和随机数来抵御重放攻击。每个通信会话都用独特的随机数,从而防止攻击者重复使用已经捕获到的通信数据。
  5. 前向保密(Forward Secrecy): SSL/TLS支持前向保密,即使长期密钥泄漏,过去的通信数据也不会被攻击者解密。这是通过动态生成临时会话密钥并定期更换来实现的。

1.1 SSL/TLS发展历史

在这里插入图片描述

1.2 TLS两个阶段

TLS协议可分为两个阶段:

  • 握手(Handshake)阶段,目的是通信双方约定好在数据传输阶段使用的加密算法及密钥(为效率考虑,在数据传输阶段会使用对称密钥算法);
  • 数据传输阶段,即发送到网络前加密数据,从网络收到数据后解密数据。

1.3 TLS报文头

在这里插入图片描述

  • 第1字节是类型(目前有4种类型):
 Record Type Values       dec      hex-------------------------------------CHANGE_CIPHER_SPEC        20     0x14ALERT                     21     0x15HANDSHAKE                 22     0x16APPLICATION_DATA          23     0x17
  • 第2-3字节是版本(目前有4种版本):
 Version Values            dec     hex-------------------------------------SSL 3.0                   3,0  0x0300TLS 1.0                   3,1  0x0301TLS 1.1                   3,2  0x0302TLS 1.2                   3,3  0x0303
  • 第4-5字节是长度(不包含报文头本身长度)

2.TLS Handshake

2.1 Handshake具体过程

在这里插入图片描述

  • 第1步:客户端发送ClientHello报文。作用是告诉服务器,本客户端所支持的TLS协议版本,以及支持的加密算法等。
  • 第2步:服务器发送ServerHello报文。主要是告诉客户端,服务器选择了一个它认为安全的,且双方都支持的加密算法;如果服务器认为客户端所支持的加密算法都不安全,则服务器可以发送一个ALERT报文。
  • 第3步:服务器发送Certificate报文。其主要作用是服务器发送自己的证书给客户端。
  • 第4步:服务器发送ServerKeyExchange。其作用是提供一些信息,以便双方有足够的信息来约定一个数据传输阶段所使用的对称密钥算法的密钥。这个报文是可选的,如果使用Diffie-Hellman方式来约定密钥,则这个是必须的;如果是RSA方式来约定密钥,它可以省略,参见后面介绍的ClientKeyExchange报文。
  • 第5步:服务器发送CertificateRequest。作用是开启”双向认证(Mutual authentication)“模式,即不仅客户端要验证服务器,而且服务器还要验证客户端。这种方式在https网站中很少使用,如果对https网站进行抓包,一般不会有这个报文。
  • 第6步:服务器发送ServerHelloDone。服务器发送此消息以指示握手消息的结束。
  • 第7步:客户端发送Certificate报文(仅当客户端收到了CertificateRequest时才发送,即服务器开启了双向认证)。主要作用是客户端发送自己的证书给服务器。
  • 第8步:客户端发送ClientKeyExchange报文。其主要作用是提供一些信息,以便双方有足够的信息来约定一个数据传输阶段所使用的对称算法的密钥。如RSA方式,则客户端生成一个对称算法的密钥后,使用服务器的公钥加密传送给服务器。如果是Diffie-Hellman方式,则传送必要信息以便双方可以按约定方式生成一个密钥。
  • 第9步:客户端发送CertificateVerify报文(仅当客户端收到了CertificateRequest时才发送,即服务器开启了双向认证)。主要作用是客户端发送一段它签名的信息给服务器,这样服务器使用客户端的公钥就可以验证签名,从而验证客户端。
  • 第10步:客户端发送ChangeCipherSpec报文,告诉服务器你可以使用加密模式了。注:ChangeCipherSpec报文不属于Handshake报文,它是TLS顶级报文,存在于TLS报文头中。
  • 第11步:客户端发送Finished报文,告诉服务器我准备好加密通信了。
  • 第12步:服务器发送ChangeCipherSpec报文,告诉客户端你可以使用加密模式了。
  • 第13步:服务器发送Finished报文,告诉客户端我准备好加密通信了。至此,握手结束。
2.1.1 单向认证和双向认证

握手阶段,如果服务器发送了CertificateRequest,就意味着开启”双向认证“。和单向认证相比,”双向认证“在握手阶段多了下面3种报文:

  • 服务器发送的 CertificateRequest
  • 客户端发送的 CertificateCertificateVerify
2.1.2 复用TLS协商结果

当客户端和服务器在TLS握手过程中建立了一个安全连接后,可以通过复用TLS协商结果来提升后续通信的效率和性能。这通常可以通过两种方式来实现:Session Identifier 和 Session Ticket。

Session Identifier(会话标识符)

Session Identifier 是一种简单的方式,它使用一个唯一的标识符来引用之前的TLS会话。

  1. 建立会话:在TLS握手过程中,如果服务器支持会话复用,它会在ServerHello消息中包含一个Session Identifier。客户端可以在以后的请求中使用这个标识符来复用会话。
  2. 客户端发送请求:客户端在HTTP请求中包含之前建立的Session Identifier。
  3. 服务器检查会话:当服务器收到请求时,它会检查Session Identifier是否有效。如果有效,服务器可以使用之前协商的加密参数和密钥,而不需要进行完整的TLS握手。

Session Identifier 的优点是它很简单,但它的缺点是,如果服务器重新启动或者会话超时,之前的Session Identifier就会失效,需要重新建立会话。

Session Ticket(会话票据)

Session Ticket 是一种更灵活的方式,它允许会话信息在服务器重启后仍然有效。

  1. 生成会话票据:在TLS握手完成后,服务器可以将会话信息加密并存储在一个会话票据中,然后发送给客户端。
  2. 客户端发送请求:客户端在HTTP请求中包含会话票据。
  3. 服务器解密会话票据:当服务器收到请求时,它可以解密会话票据并使用其中的会话信息来恢复会话。

Session Ticket 的优点是它可以在服务器重启后仍然保持会话的有效性,但需要确保会话票据的安全性,以防止被恶意利用。

总的来说,Session Identifier 是一种简单且有效的会话复用方式,但在某些情况下可能会失效。Session Ticket 提供了更灵活的会话复用机制,可以在服务器重启后仍然保持会话的有效性。服务器可以根据具体情况选择使用其中一种或两者结合使用。

2.2 Handshake报文格式

                         |||Record Layer      |  Handshake Layer|                              |                              ||                              |                              |
+----+----+----+----+----+----+----+----+----+------ - -+----+----+----+----+------ - -+ ......
| 22 |    |    |    |    |    |    |    |    |          |    |    |    |    |          |
|0x16|    |    |    |    |    |    |    |    |message   |    |    |    |    |message   |
+----+----+----+----+----+----+----+----+----+------ - -+----+----+----+----+------ - -+/             /--/--/  | \    \----\-----\            | \    \----\-----\            |/                /      |  \         \                    \         \
type: 22         /       |   \     handshake message length \    handshake message length/             type                          type/length: arbitrary (up to 16k)Handshake Type Values    dec      hex-------------------------------------HELLO_REQUEST              0     0x00CLIENT_HELLO               1     0x01SERVER_HELLO               2     0x02CERTIFICATE               11     0x0bSERVER_KEY_EXCHANGE       12     0x0cCERTIFICATE_REQUEST       13     0x0dSERVER_HELLO_DONE         14     0x0eCERTIFICATE_VERIFY        15     0x0fCLIENT_KEY_EXCHANGE       16     0x10FINISHED                  20     0x14

共有10种类型的Handshake报文,多个Handshake报文可以组合成一个TLS Record,上面演示中就有两个Handshake报文。具体可参考:10种 Handshake报文

具体可参考:

3. wireshark抓取TLS报文

以ping https://www.csdn.net为例
在这里插入图片描述

因为这是一次单向认证的Handshake过程,故比较简单。

3.1 第一次握手

在这里插入图片描述

重点可以关注红框里的内容,ClientHello报文告诉了服务器端,客户端支持的TLS协议的最高版本(TLS 1.2)以及支持的加密算法

3.2 第二次握手

在这里插入图片描述

服务器给客户端返回的消息注意关注TLS协议版本,服务器选择的加密算法(TLS_AES_128_GCM_SHA256),以及Change Cipher Spec报文(告诉客户端可以开始加密通信了)。

3.3 第三次握手

在这里插入图片描述

3.4 第四次握手

主要进行数据传输,不进行赘述。


http://www.ppmy.cn/news/1131623.html

相关文章

Python函数语法与面向对象回顾(精华)

目录 函数 语法定义 返回值 位置参数 关键字传递 默认参数 函数参数中 / 作用 lambda表达式 递归函数 面向对象 初识对象 继承 构造函数 ​编辑 多态 "私有属性" 动态 类方法和静态方法 函数 语法定义 pyhon的函数定义语法是 def 函数名(参数…

算法练习7——买卖股票的最佳时机

LeetCode 121 买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可…

从MVC到DDD,该如何下手重构?

作者:付政委 博客:bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!😄 大家好,我是技术UP主小傅哥。多年的 DDD 应用,使我开了技术的眼界! MVC 旧工程腐化严重,…

Python 笔记05(装饰器的使用)

一 装饰器的使用 (property) property 是 Python 中用于创建属性的装饰器。它的作用是将一个类方法转换为类属性,从而可以像 访问属性一样访问该方法,而不需要使用函数调用的语法。使用 property 主要有以下好处: 封装性和隐藏实现细节&…

云计算安全:保护你的数据免受黑客侵害

文章目录 云计算的崛起云计算安全的挑战1. 数据隐私2. 身份认证和访问控制3. 网络安全4. 云供应商安全 云计算安全的最佳实践1. 数据加密2. 强身份认证3. 访问控制4. 安全审计5. 更新和漏洞管理6. 培训和教育 云计算安全的未来1. 量子安全性2. 人工智能和机器学习3. 边缘计算安…

SVM(下):如何进行乳腺癌检测?

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据开发、数据分析等。 🐴欢迎小伙伴们点赞👍🏻、收藏⭐️、…

iOS自动化测试方案(二):Xcode开发者工具构建WDA应用到iphone

文章目录 一、环境准备1.1、软件环境1.2、硬件环境1.3、查看版本 二、安装WDA过程2.7、构建失败,这类错误有很多,比如在选择开发者账号后,就会提示:Failed to register bundle identifier表示应用唯一注册失败2.9、第二个错误,完全…

jenkins联动显示或隐藏参数

1. 添加组件 Active Choices Plug-in 如jenkins无法联网,可在以下两个地址中下载插件,然后放到/home/jenkins/.jenkins/plugin下面重启jenkins即可 Active Choices Active Choices | Jenkins plugin 2. 效果如下: sharding为空时&#xf…