4. SSLKEYLOGFILE环境变量:NSS Key Log格式、浏览器配置与设置方法
好,咱们进入第四章节。前面几章我们聊了TLS握手、密钥交换,你可能已经跃跃欲试,想用Wireshark直接抓包看加密流量了。但一打开,满屏的“Application Data”,什么都看不到,对吧?
别急,解密HTTPS的钥匙,就藏在一个环境变量里——SSLKEYLOGFILE。我个人觉得,这是Wireshark分析HTTPS最实用的技巧,没有之一。
4.1 什么是SSLKEYLOGFILE?
说白了,SSLKEYLOGFILE就是一个文本文件。浏览器或支持TLS的应用程序,会把每次TLS会话的密钥信息写进去。Wireshark读到这个文件,就能解开加密的流量。
你可能会问:“这不安全吧?密钥都写出来了?”嗯,这里要注意:这个文件只记录会话密钥,不是私钥。而且只有你能访问本机文件才能拿到。所以,在调试环境用完全没问题,生产环境千万别开。
4.2 NSS Key Log格式长什么样?
这个格式最早来自Mozilla的NSS库,所以叫NSS Key Log。格式非常简单,每行一个密钥条目。我截个典型的例子给你看:
# SSLKEYLOGFILE generated by Chrome
# Format: <label> <client_random> <secret>
CLIENT_RANDOM 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba98
RSA 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01
常见的标签有几种,我整理了一个表格:
| 标签 | 含义 | 适用场景 |
|---|---|---|
CLIENT_RANDOM |
客户端随机数 + 主密钥 | TLS 1.2 及以下,最常用 |
RSA |
RSA密钥交换时的预主密钥 | 旧版RSA密钥交换(已不推荐) |
CLIENT_EARLY_TRAFFIC_SECRET |
TLS 1.3 0-RTT密钥 | TLS 1.3 早期数据 |
SERVER_HANDSHAKE_TRAFFIC_SECRET |
TLS 1.3 服务端握手密钥 | TLS 1.3 握手阶段 |
EXPORTER_SECRET |
TLS 1.3 导出密钥 | TLS 1.3 会话恢复 |
你看,TLS 1.3的标签比1.2多了不少。为什么?因为TLS 1.3的密钥派生更复杂,每个阶段都有独立的密钥。我在项目中遇到过,用旧版Wireshark解析TLS 1.3的keylog,结果一堆“Unknown label”,升级版本就好了。
4.3 浏览器配置:Chrome和Firefox
两大主流浏览器都支持SSLKEYLOGFILE,但配置方式略有不同。我分别说一下。
4.3.1 Chrome / Chromium系
Chrome完全依赖环境变量。你只要在启动Chrome之前设置好SSLKEYLOGFILE,它就会自动写入。不需要任何命令行参数。
但有个坑:如果你用Chrome的“应用模式”或某些扩展,可能不会触发keylog写入。我建议用普通的Chrome窗口测试。
4.3.2 Firefox
Firefox同样支持环境变量。不过,Firefox还有一个偏好设置可以开启:
- 地址栏输入
about:config - 搜索
network.ssl.keylog.file - 设置为你想保存的文件路径
我个人习惯用环境变量,因为对所有应用统一生效。但如果你只想给Firefox单独开启,用偏好设置更干净。
4.4 环境变量设置方法
设置环境变量,不同操作系统方法不同。我分别演示一下。
4.4.1 Windows
Windows下有两种方式:临时设置和永久设置。
临时设置(推荐调试用):
# 打开命令提示符(管理员非必需)
set SSLKEYLOGFILE=C:\Users\你的用户名\sslkeylog.log
# 然后启动Chrome
start chrome
永久设置(系统环境变量):
- 右键“此电脑” → 属性 → 高级系统设置
- 点击“环境变量”
- 在“系统变量”或“用户变量”中新建
- 变量名:
SSLKEYLOGFILE - 变量值:
C:\Users\你的用户名\sslkeylog.log
4.4.2 macOS / Linux
macOS和Linux类似,用export命令:
# 临时设置
export SSLKEYLOGFILE=~/sslkeylog.log
# 启动浏览器(以Chrome为例)
/Applications/Google\ Chrome.app/Contents/MacOS/Google Chrome
# 或者用open命令(macOS)
open -a Google Chrome
如果你想让设置持久化,可以加到shell配置文件中:
# 编辑 ~/.bashrc 或 ~/.zshrc
echo 'export SSLKEYLOGFILE=$HOME/sslkeylog.log' >> ~/.zshrc
source ~/.zshrc
我曾经在macOS上踩过一个坑:用open -a启动Chrome时,环境变量有时不生效。后来发现,必须用终端直接启动可执行文件才行。你想想看,open命令会启动一个新的进程上下文,可能继承不到当前shell的变量。
4.5 验证keylog是否生效
设置好之后,怎么知道它真的在写?我教你一个快速验证的方法:
- 启动浏览器,访问一个HTTPS网站(比如 https://www.baidu.com)
- 查看keylog文件:
cat ~/sslkeylog.log(Linux/macOS)或type C:\Users\你的用户名\sslkeylog.log(Windows) - 如果看到类似
CLIENT_RANDOM ...的行,说明成功了
如果文件是空的,检查以下几点:
- 环境变量名是否拼写正确?注意是
SSLKEYLOGFILE,不是SSLKEYLOGFILE少个字母 - 文件路径是否有写入权限?
- 浏览器是否完全退出后重新启动?
4.6 核心逻辑:SSLKEYLOGFILE的工作流程
为了让你更直观地理解整个过程,我画了一张流程图。它展示了从设置环境变量到Wireshark成功解密的完整链路。
这张图把整个链路串起来了。你从设置环境变量开始,到浏览器写入密钥,最后Wireshark加载解密,一步都不能少。我在培训新人时,经常让他们先对着这张图检查,90%的问题都能自己找到。
4.7 避坑指南
最后,分享几个我踩过的坑:
- 路径不要有中文或空格:Windows下尤其注意,最好用纯英文路径。我曾经用“C:\用户\密钥.log”,结果浏览器直接报错。
- 文件不要提前创建:让浏览器自动创建文件。如果你手动建了一个空文件,权限可能不对。
- Wireshark要重新加载:抓包过程中修改了keylog文件,Wireshark不会自动刷新。需要重新打开pcap或重新加载keylog。
- TLS 1.3需要Wireshark 3.0+:旧版本不支持TLS 1.3的keylog格式,升级到最新版就好。