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还有一个偏好设置可以开启:

  1. 地址栏输入 about:config
  2. 搜索 network.ssl.keylog.file
  3. 设置为你想保存的文件路径

我个人习惯用环境变量,因为对所有应用统一生效。但如果你只想给Firefox单独开启,用偏好设置更干净。

小提示: 如果你同时开了Chrome和Firefox,它们会往同一个keylog文件里写内容。Wireshark读取时,会自动匹配每个会话的Client Random,所以混在一起也没问题。

4.4 环境变量设置方法

设置环境变量,不同操作系统方法不同。我分别演示一下。

4.4.1 Windows

Windows下有两种方式:临时设置和永久设置。

临时设置(推荐调试用):

# 打开命令提示符(管理员非必需)
set SSLKEYLOGFILE=C:\Users\你的用户名\sslkeylog.log
# 然后启动Chrome
start chrome

永久设置(系统环境变量):

  1. 右键“此电脑” → 属性 → 高级系统设置
  2. 点击“环境变量”
  3. 在“系统变量”或“用户变量”中新建
  4. 变量名:SSLKEYLOGFILE
  5. 变量值:C:\Users\你的用户名\sslkeylog.log
警告: 永久设置后,所有支持SSLKEYLOGFILE的应用都会写入密钥。用完记得删除或清空变量,避免密钥泄露。

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是否生效

设置好之后,怎么知道它真的在写?我教你一个快速验证的方法:

  1. 启动浏览器,访问一个HTTPS网站(比如 https://www.baidu.com)
  2. 查看keylog文件:cat ~/sslkeylog.log(Linux/macOS)或 type C:\Users\你的用户名\sslkeylog.log(Windows)
  3. 如果看到类似 CLIENT_RANDOM ... 的行,说明成功了

如果文件是空的,检查以下几点:

  • 环境变量名是否拼写正确?注意是 SSLKEYLOGFILE,不是 SSLKEYLOGFILE 少个字母
  • 文件路径是否有写入权限?
  • 浏览器是否完全退出后重新启动?

4.6 核心逻辑:SSLKEYLOGFILE的工作流程

为了让你更直观地理解整个过程,我画了一张流程图。它展示了从设置环境变量到Wireshark成功解密的完整链路。

SSLKEYLOGFILE 工作流程图 SSLKEYLOGFILE 工作流程 设置 SSLKEYLOGFILE 启动 Chrome / Firefox 访问 HTTPS 网站 写入 sslkeylog.log Wireshark 加载 Key Log 解密 HTTPS 流量 关键点 • 环境变量名必须完全匹配 • 浏览器需完全重启 • 文件路径要有写入权限 常见问题 • 文件为空:检查变量名 • 无法解密:TLS版本不匹配 • 权限错误:用管理员运行

这张图把整个链路串起来了。你从设置环境变量开始,到浏览器写入密钥,最后Wireshark加载解密,一步都不能少。我在培训新人时,经常让他们先对着这张图检查,90%的问题都能自己找到。

4.7 避坑指南

最后,分享几个我踩过的坑:

  • 路径不要有中文或空格:Windows下尤其注意,最好用纯英文路径。我曾经用“C:\用户\密钥.log”,结果浏览器直接报错。
  • 文件不要提前创建:让浏览器自动创建文件。如果你手动建了一个空文件,权限可能不对。
  • Wireshark要重新加载:抓包过程中修改了keylog文件,Wireshark不会自动刷新。需要重新打开pcap或重新加载keylog。
  • TLS 1.3需要Wireshark 3.0+:旧版本不支持TLS 1.3的keylog格式,升级到最新版就好。
核心总结: SSLKEYLOGFILE是Wireshark解密HTTPS的“万能钥匙”。设置环境变量 → 启动浏览器 → 访问网站 → 写入密钥 → Wireshark加载 → 解密成功。记住这个流程,HTTPS在你面前就是透明的。