目录
一、前置知识: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-Fi 或 WLAN |
| 有线网络 | 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 列显示为
TLS或HTTP/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 无数据。
排查步骤:
-
确认接口选择
plain
Wireshark → 捕获 → 选项 → 选择有流量的物理网卡 -
确认目标地址可达
batch
ping 192.168.100.10 nslookup gateway.example.local -
检查是否存在代理
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 捕获时间同步
□ 分析完成后删除密钥文件(安全清理)