解密 TLS 流量在做什么
解密 HTTPS 不需要私钥,而是让客户端自己把会话密钥导出到文件,分析工具再读取该文件还原明文。支持导出密钥的客户端包括主流浏览器与部分开发库:设置环境变量指向日志文件,复现访问后,在首选项里把该文件配置为密钥日志,重新打开抓包文件就能看到明文的应用层内容。它只对导出密钥的那一台客户端有效,服务端与其他客户端的流量无法用这种方式解密。
基本信息
| 原理 | 客户端导出会话密钥,分析工具据此还原明文 |
|---|---|
| 前提条件 | 客户端支持密钥日志导出,且流量由该客户端发起 |
| 关键配置 | 环境变量指向日志文件,工具首选项里指定该文件 |
| 适用范围 | 仅本机受控客户端的流量 |
| 敏感性 | 密钥日志等同于解密能力,属敏感资料 |
典型使用场景
- 排查前端与接口的交互问题:看到明文请求与响应内容
- 核对字段是否真正发出:确认请求体与请求头内容
- 分析压缩与分块问题:解密后才能看到传输编码细节
- 验证接口返回结构:直接读响应体而不依赖业务日志
- 教学与取证:在受控环境下演示加密流量内容
操作路径
操作路径
# 1) 设置密钥日志环境变量(以 Linux 桌面与常用浏览器为例)
export SSLKEYLOGFILE=/tmp/sslkeys.log
# 2) 启动浏览器并复现访问
google-chrome --user-data-dir=/tmp/profile & # 该进程会继承上面的环境变量
# 3) 在分析工具里指定密钥日志文件:首选项 → 协议 → TLS → 密钥日志文件名
# 4) 重新打开抓包文件,明文的应用层内容即可显示常见限制与说明
| 限制 | 表现 | 说明 |
|---|---|---|
| 仅限导出密钥的客户端 | 其他客户端仍是密文 | 服务端流量无法用这种方式解密 |
| 部分运行环境不支持导出 | 日志文件始终为空 | 旧版本运行环境或特定实现可能不提供该能力 |
| 新版本协议报文加密 | 可见消息很少 | 握手的大部分消息在加密记录中,属正常现象 |
| 密钥日志被清理 | 重新分析时无法解密 | 日志文件删除后明文无法还原 |
| 多客户端混抓 | 只能解开其中一部分 | 需要按客户端分别导出密钥 |
解密能力来自密钥日志文件本身。分析完成后应及时清理这些文件,并在需要长期保存抓包文件的场合评估是否需要同时脱敏。
解密他人流量、或在未授权环境中导出会话密钥,可能涉及合规风险。仅在自有或明确授权的环境里使用这种方法,并在结论中说明数据来源。
验证是否生效
验证是否生效
tls.handshake.type == 1 # 解密前后都能看到的客户端问候
http.request # 出现该字段说明解密成功
tls.app_data # 解密后应用数据记录可被解析判读要点
- 配置后仍看不到明文,先确认抓包时间是否在设置环境变量之后
- 只有部分会话能解密,通常是导出密钥的客户端与抓包客户端不是同一个
- 新版本协议下加密握手是设计使然,可见消息少不代表解密失败
- 用浏览器开发者工具能看到的请求,在解密视图里应能一一对应,两者可交叉验证