Wireshark 解密 HTTPS 流量

目录

  1. 前置知识:TLS 预主密钥机制

  2. 环境准备与配置

  3. Wireshark 解密配置

  4. 实战抓包分析

  5. 常见问题与解决方案


一、前置知识:TLS 预主密钥机制

1.1 解密原理

复制代码
┌─────────────┐                    ┌─────────────┐
│   浏览器     │ ──── TLS 握手 ──── │   服务器    │
│  (Chrome)   │                    │  (Gateway)  │
└──────┬──────┘                    └─────────────┘
       │
       │  预主密钥(pre-master secret)
       ▼
┌─────────────┐
│ ssl-keys.log │  ◄── 写入密钥日志
└──────┬──────┘
       │
       ▼
┌─────────────┐
│  Wireshark   │  ◄── 读取密钥,解密流量
└─────────────┘

核心逻辑:TLS 握手阶段生成的预主密钥可以推导出会话密钥,拥有它就能解密后续所有加密通信。

1.2 为什么需要手动配置?

现代浏览器出于安全考虑,默认不会导出密钥。需要通过环境变量显式开启此功能,仅用于调试分析

⚠️ 安全警告:预主密钥日志文件等同于明文密码,务必妥善保管,分析完成后立即删除。


二、环境准备与配置

2.1 获取预主密钥(Windows 环境)

步骤 1:创建启动脚本

创建文件 start-capture.bat

复制代码
@echo off
chcp 65001 >nul
echo [Wireshark HTTPS 解密环境启动器]
echo =======================================

:: 1. 清理残留进程
echo [1/4] 终止现有 Chrome 进程...
taskkill /F /IM chrome.exe 2>nul
timeout /t 2 >nul

:: 2. 设置密钥日志路径(使用临时路径示例)
set SSLKEYLOGFILE=C:\Temp\ssl-session-keys.log
echo [2/4] 密钥日志路径: %SSLKEYLOGFILE%

:: 3. 清理旧日志(可选)
if exist "%SSLKEYLOGFILE%" (
    echo      清理旧日志文件...
    del "%SSLKEYLOGFILE%"
)

:: 4. 启动浏览器
echo [3/4] 启动 Chrome...
start "" "C:\Program Files\Google\Chrome\Application\chrome.exe"

:: 5. 验证文件生成
echo [4/4] 等待浏览器初始化...
timeout /t 3 >nul

if exist "%SSLKEYLOGFILE%" (
    echo [✓] 环境配置成功!密钥文件已就绪。
    echo      文件大小: 
    for %%F in ("%SSLKEYLOGFILE%") do echo      %%~zF bytes
) else (
    echo [!] 警告: 密钥文件未生成,请访问 HTTPS 网站后重试
)

echo.
echo 操作提示:
echo   1. 在 Chrome 中访问 https://gateway.example.local
echo   2. 观察密钥文件是否增长
echo   3. 打开 Wireshark 开始捕获
echo.
pause
步骤 2:验证密钥文件格式

正常生成的 ssl-session-keys.log 内容示例:

复制代码
# SSL/TLS secrets log file, generated by NSS
CLIENT_RANDOM 5f8a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f 8a3f2c5d7e9b1a4c6d8f0e2b5c7d9e1f3a5b7c9d1e3f5a7b9c1d3e5f7a9b1c3d5
CLIENT_RANDOM 9c4e1d2f3a5b7c9d1e3f5a7b9c1d3e5f7a9b1c3d5e7f9a1b3c5d7e9f1a3b5 2b7a9f1c3e5d7b9a1f3e5d7b9a1f3e5d7b9a1f3e5d7b9a1f3e5d7b9a1f3e5d7b9a1
CLIENT_EARLY_TRAFFIC_SECRET 1a2b3c...

每行对应一个 TLS 会话,格式为:

  • CLIENT_RANDOM:客户端随机数标识

  • 64 字符十六进制:客户端随机数

  • 后续字符串:预主密钥


三、Wireshark 解密配置

3.1 配置密钥文件路径

复制代码
Wireshark → 编辑(Edit) → 首选项(Preferences) → Protocols → TLS

配置项:

配置项 说明
(Pre)-Master-Secret log filename C:\Temp\ssl-session-keys.log 绝对路径,避免中文和空格
RSA keys list 留空 仅用于特定 RSA 密钥,现代浏览器多用 ECDHE
SSL debug file 可选 解密失败时用于诊断

3.2 优化显示设置

同一位置配置:

  • Reassemble TLS records spanning multiple TCP segments: ☑ 启用

  • Reassemble TLS Application Data spanning multiple records: ☑ 启用

确保能重组分片的 TLS 数据。


四、实战抓包分析

4.1 捕获接口选择

复制代码
Wireshark 启动界面 → 选择正确的网络接口

表格

场景 选择接口
直接上网(Wi-Fi) Wi-FiWLAN
有线网络 Ethernet以太网
通过代理/VPN 代理软件创建的虚拟网卡(如 Clash, v2ray
本地回环测试 NPCAP Loopback Adapter

验证方法:点击接口旁的蓝色波浪线,确认有流量波动。

4.2 捕获过滤器设置

为减少噪音,设置捕获过滤器(Capture Filter):

复制代码
host 192.168.100.10 and port 443

注:此处 192.168.100.10 为临时网关地址,实际使用时替换为目标 IP。

4.3 分析加密流量

成功解密的标志

Packet List 面板:

  • Protocol 列显示为 TLSHTTP/2(而非 TLSv1.2/TLSv1.3

  • Info 列显示 HTTP 方法和路径(如 GET /api/status

Packet Details 面板:

复制代码
Frame 1234: 1514 bytes on wire
Ethernet II
Internet Protocol Version 4
Transmission Control Protocol
Transport Layer Security
    TLSv1.3 Record Layer: Application Data Protocol: http
        Content Type: Application Data (23)
        Version: TLS 1.3 (0x0304)
        Length: 1448
        Encrypted Application Data: ...
        [Decrypted TLS]                           ◄── 关键节点
            [Protocol: HTTP/1.1]                  ◄── 解密后的应用层
            HTTP/1.1 200 OK\r\n
            Content-Type: application/json\r\n
            ...
查看解密后的 HTTP 内容

展开 [Decrypted TLS] → 可见完整的 HTTP 请求/响应:

  • 请求方法、URL、Headers

  • POST 请求的 JSON 载荷

  • 响应状态码和 Body 数据


五、常见问题与解决方案

问题 1:密钥文件未生成

现象ssl-session-keys.log 文件不存在或大小为 0。

排查清单

表格

检查项 命令/方法 预期结果
环境变量是否设置 set SSLKEYLOGFILE 显示配置的路径
浏览器是否通过 CMD 启动 任务管理器查看父进程 cmd.exe 应为 Chrome 的父进程
是否访问了 HTTPS 网站 浏览器地址栏确认 协议必须为 https://
目录写入权限 echo test > C:\Temp\test.txt 文件成功创建

解决方案

复制代码
:: 确保完全关闭 Chrome 后重新启动
taskkill /F /IM chrome.exe
set SSLKEYLOGFILE=C:\Temp\ssl-session-keys.log
start chrome

问题 2:Wireshark 抓不到包

现象:密钥文件正常,但 Wireshark 无数据。

排查步骤

  1. 确认接口选择

    plain

    复制代码
    Wireshark → 捕获 → 选项 → 选择有流量的物理网卡
  2. 确认目标地址可达

    batch

    复制代码
    ping 192.168.100.10
    nslookup gateway.example.local
  3. 检查是否存在代理

    plain

    复制代码
    Chrome 设置 → 系统 → 打开代理设置

    如有代理,流量可能走虚拟网卡,需切换 Wireshark 接口。

问题 3:抓到包但无法解密

现象 :能看到 TLS 协议,但无 [Decrypted TLS] 节点。

可能原因

表格

原因 验证 解决
密钥文件路径错误 文件 → 首选项 → TLS 检查路径 使用绝对路径,重新选择
密钥与会话不匹配 比较时间戳 确保抓包和密钥生成同时进行
TLS 1.3 早期数据 检查 CLIENT_EARLY_TRAFFIC_SECRET 升级 Wireshark 至 3.0+
使用了 ECDHE 以外算法 查看 Server Hello 现代浏览器默认支持,一般无问题

诊断技巧

plain

复制代码
Wireshark → 分析 → 专家信息 → 搜索 "TLS" 相关警告

问题 4:只能解密部分流量

现象:部分 HTTPS 请求显示明文,部分仍为加密。

原因:浏览器复用了之前的 TLS 会话(Session Resumption),该会话的密钥未在日志中。

解决

复制代码
:: 1. 关闭浏览器
taskkill /F /IM chrome.exe

:: 2. 清空密钥文件
del C:\Temp\ssl-session-keys.log

:: 3. 重新启动并立即抓包
set SSLKEYLOGFILE=C:\Temp\ssl-session-keys.log
start chrome
:: 立即在 Wireshark 开始捕获

附录:完整检查清单

复制代码
□ 环境变量 SSLKEYLOGFILE 已设置
□ 浏览器通过 CMD/脚本启动(非桌面图标)
□ 访问了 HTTPS 网站(非 HTTP)
□ 密钥文件已生成且有内容(CLIENT_RANDOM 开头)
□ Wireshark 中配置了正确的密钥文件路径
□ 选择了正确的捕获接口(物理网卡/代理网卡)
□ 捕获过滤器未过度限制(可先清空测试)
□ 浏览器和 Wireshark 捕获时间同步
□ 分析完成后删除密钥文件(安全清理)
相关推荐
2501_916008893 小时前
2026 iOS 证书管理,告别钥匙串依赖,构建可复制的签名环境
android·ios·小程序·https·uni-app·iphone·webview
serve the people6 小时前
ACME 协议流程与AllinSSL 的关系(二)
网络协议·https·ssl
serve the people6 小时前
ACME 协议流程与AllinSSL 的关系(三)
服务器·网络·https
漠月瑾-西安6 小时前
Cookie Secure 属性:守护网络传输安全的关键防线
网络安全·https·web开发·安全配置·cookie安全·会话保护
月亮!8 小时前
6大AI测试工具极限压测:微软TuringAI竟率先崩溃
java·人工智能·python·测试工具·microsoft·云原生·压力测试
Byte不洛8 小时前
Cookie、Session、HTTPS 全解析:从原理到中间人攻击
计算机网络·https·网络编程·cookie·后端开发
2501_9160088910 小时前
iOS App 抓包看不到内容,从有请求没数据一步步排查
android·ios·小程序·https·uni-app·iphone·webview
llilian_1610 小时前
音频分析仪 专业音频分析仪破解行业测试痛点实战解析 音频测试仪 专业音频分析仪
大数据·功能测试·单片机·测试工具·音视频
123过去18 小时前
wifi-honey使用教程
linux·网络·测试工具