news 2026/4/17 3:19:19

从一次抓包看透TLS 1.2握手:Wireshark拆解Client Hello、Server Hello和密钥交换

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从一次抓包看透TLS 1.2握手:Wireshark拆解Client Hello、Server Hello和密钥交换

从一次抓包看透TLS 1.2握手:Wireshark拆解Client Hello、Server Hello和密钥交换

当你第一次在Wireshark中看到TLS握手过程时,那些密密麻麻的十六进制数据可能让人望而生畏。但就像侦探破案一样,每个字段背后都藏着安全通信的关键线索。本文将带你用Wireshark实际抓包,逐帧拆解TLS 1.2握手过程中的核心字段,揭示加密通信背后的精妙设计。

1. 准备工作:捕获TLS握手流量

要观察TLS握手,首先需要配置Wireshark捕获HTTPS流量。由于现代浏览器默认使用TLS 1.3,我们需要特别配置以触发TLS 1.2握手:

# 在Linux/Mac上设置浏览器使用TLS 1.2 export SSLKEYLOGFILE="$HOME/ssl_key.log" chrome --ssl-version-min=tls1.2 --ssl-version-max=tls1.2

然后在Wireshark中设置SSL密钥日志文件路径:

  1. 进入"Edit" → "Preferences" → "Protocols" → "TLS"
  2. 在"(Pre)-Master-Secret log filename"中选择上面设置的ssl_key.log文件

提示:确保只捕获目标网站的流量,可以使用过滤器如tcp.port == 443 && ip.addr == <目标IP>

2. 解密Client Hello:客户端的能力声明

Client Hello是握手的第一步,相当于客户端向服务器提交的"能力清单"。在Wireshark中展开一个Client Hello包,你会看到以下关键字段:

字段名示例值作用
VersionTLS 1.2 (0x0303)客户端支持的最高TLS版本
Random32字节数据客户端随机数,用于密钥生成
Session ID(空或32字节)用于会话恢复的标识符
Cipher Suites列表如TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256客户端支持的加密套件
Compression Methods通常为null(0)支持的压缩方法(现代TLS已弃用)
Extensions包含server_name, signature_algorithms等扩展功能列表

关键点解析

  • 随机数中的前4字节实际上是UNIX时间戳,后28字节是真正的随机数
  • 现代TLS通常使用扩展而非基本字段来声明更复杂的能力
  • 加密套件列表按优先级排序,服务器会选择双方都支持的第一个套件

3. Server Hello响应:服务器的选择与认证

服务器收到Client Hello后,会返回Server Hello报文,这是握手的关键转折点。在Wireshark中观察到的典型结构:

Handshake Protocol: Server Hello Version: TLS 1.2 (0x0303) Random: 32字节(服务器随机数) Session ID: (空或与客户端相同) Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f) Compression Method: null (0x00) Extensions Length: ...

紧接着Server Hello,服务器会发送三个关键消息:

  1. Certificate:服务器的证书链
  2. Server Key Exchange:包含DH/ECDH参数(非RSA密钥交换时)
  3. Server Hello Done:表示服务器握手消息结束

注意:在RSA密钥交换模式下,不会出现Server Key Exchange消息,因为密钥交换将通过客户端加密Pre-Master Secret实现。

4. 密钥交换的核心:从随机数到Master Secret

TLS最精妙的部分在于双方能在不传输密钥的情况下计算出相同的会话密钥。让我们拆解这个过程:

4.1 三个随机数的来源

  1. 客户端随机数(ClientHello.random)
  2. 服务器随机数(ServerHello.random)
  3. Pre-Master Secret(由客户端生成并通过密钥交换传递)

4.2 密钥计算过程

# 伪代码展示Master Secret计算过程 def PRF(secret, label, seed, length): # TLS 1.2使用的伪随机函数 ... master_secret = PRF( pre_master_secret, "master secret", client_random + server_random, 48 )

实际在Wireshark中,你可以通过以下步骤验证密钥计算:

  1. 右键TLS数据包 → "Protocol Preferences" → "Export Session Keys..."
  2. 导出的密钥文件会包含计算出的Master Secret
  3. 对比客户端和服务端日志中的密钥值是否一致

4.3 会话密钥派生

Master Secret并不是直接用于加密的密钥,而是从中派生出6个实际使用的密钥:

密钥类型用途
client write MAC key客户端发送数据的MAC校验
server write MAC key服务器发送数据的MAC校验
client write encryption key客户端发送数据的加密
server write encryption key服务器发送数据的加密
client write IV客户端使用的初始化向量
server write IV服务器使用的初始化向量

5. 握手完成与加密通信

在密钥交换完成后,双方会发送Change Cipher Spec消息,表示后续通信将使用协商的加密参数。然后是Finished消息,这是第一个加密的消息,用于验证握手过程是否成功。

在Wireshark中观察到的完整流程:

  1. Change Cipher Spec(客户端)
  2. Finished(客户端,加密)
  3. Change Cipher Spec(服务器)
  4. Finished(服务器,加密)

此后所有的Application Data都将是加密状态。要验证解密是否正确:

  • 检查Application Data包是否显示为解密状态
  • 对于HTTPS,可以尝试过滤http请求查看是否成功解密

6. 高级话题:会话恢复与优化

TLS提供了两种会话恢复机制来避免完整的握手过程:

6.1 Session ID恢复

  • 在初始握手中,服务器会分配一个Session ID
  • 后续连接时客户端在Client Hello中携带这个ID
  • 如果服务器接受,可以直接使用之前的Master Secret

6.2 Session Tickets(RFC 5077)

Extension: session_ticket (35) Type: session_ticket (35) Length: ... Data: (opaque ticket data)

服务器加密包含会话状态的ticket发给客户端,客户端后续连接时发送这个ticket即可恢复会话。

在Wireshark中,你可以通过以下特征识别会话恢复:

  • 完整的握手过程约需2-RTT,而恢复只需1-RTT
  • 恢复握手时不会出现Certificate和Server Key Exchange消息

7. 实战:诊断常见TLS问题

通过Wireshark分析,我们可以快速定位TLS握手失败的原因:

案例1:协议版本不匹配

  • 现象:服务器返回Alert消息,描述为"Protocol Version"
  • 解决方案:检查客户端和服务器支持的TLS版本交集

案例2:加密套件不兼容

  • 现象:服务器返回Alert消息,描述为"Handshake Failure"
  • 诊断:比较Client Hello和Server Hello中的Cipher Suite选择

案例3:证书验证失败

  • 现象:客户端在收到Certificate后断开连接
  • 检查点:
    • 证书是否过期
    • 证书链是否完整
    • 主机名是否匹配证书中的SAN/CN

在Wireshark中,TLS Alert消息通常位于握手失败的位置,Alert Description字段会指明具体错误原因。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 3:11:58

Vue项目中天地图动态标注的添加与删除实践

1. 天地图与Vue结合的基础准备 在Vue项目中使用天地图API前&#xff0c;需要先完成基础的环境配置。我推荐使用npm安装天地图JavaScript API的方式&#xff0c;这样能更好地与现代前端工程化开发流程结合。首先在项目中执行&#xff1a; npm install tdt-map安装完成后&#xf…

作者头像 李华
网站建设 2026/4/17 3:11:57

2025年03月CCF-GESP编程能力等级认证Python编程六级真题解析

本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 在面向对象编程中,类是一种重要的概念。下面关于类的描述中,不正确的是 ( )。 A. 类是一个抽象的概念,用于描述具有相…

作者头像 李华
网站建设 2026/4/17 3:11:33

高效判断点与图形位置关系的算法解析(矩形、椭圆、多边形)

1. 点与图形位置关系的高效判断原理 判断一个点是否位于特定图形内部&#xff0c;是计算机图形学、游戏开发和地理信息系统中的基础问题。想象一下&#xff0c;当你在手机地图上点击某个位置时&#xff0c;系统需要快速判断这个点是否在某个建筑物&#xff08;多边形&#xff0…

作者头像 李华
网站建设 2026/4/17 3:04:16

Python数据分析项目实战(060)——Python数据分析与统计综合案例

版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 项目概述 本项目适合Python数据分析数据分析新手,通过分析城市空气质量数据,综合运用NumPy、Pandas和Matplotlib库,掌握从数据加载、清洗、分析到可视化的完整流程。 本项目主要技术: 如何…

作者头像 李华
网站建设 2026/4/17 3:03:11

春秋云境CVE-2021-34257

1.阅读靶场介绍 这里能得到的信息 就是文件上传 构造木马php文件 2.启动靶场 如下所示 3.寻找后台 这里博主使用的url如下 https://eci-2zeizdkm339qzk1nbhsk.cloudeci1.ichunqiu.com/index.php/admin/login 页面如下所示 这里的账号密码是:adminadmin.com/admin 4.poc…

作者头像 李华