Wireshark 是一款广泛使用的网络协议分析工具, 它能够帮助我们分析和调试网络流量。在分析 SSL/TLS 流量时, Wireshark 可以帮助我们查看加密的数据, 但前提是我们需要提供密钥或会话信息。
使用预主密钥解密 SSL 和 TLS
在 Wireshark 中使用预主密钥 (pre-master secret key) 解密 SSL 和 TLS 流量是推荐的方法。预主密钥由客户端生成, 服务器使用该密钥派生出用于加密会话流量的主密钥。这种方法通过 Diffie-Hellman 实现, 是目前的加密标准。
你的浏览器可以记录预主密钥日志, Wireshark 可利用这些日志解密 SSL 和 TLS 会话
设置 Windows 环境变量
在 Windows 系统中, 需要设置名为 SSLKEYLOGFILE
的环境变量, 用于指定预主密钥日志文件的存储路径
-
首先右键单击
我的电脑
, 然后从菜单中选择属性
-
点击左侧的
高级系统设置
-
在
系统属性
窗口的高级
选项卡中, 点击环境变量
-
在
用户变量
下, 点击新建
。如果你想为系统上的每个用户记录 SSL 密钥, 你也可以在 系统变量 下创建变量, 但我更喜欢将其限制在我的个人资料中。 -
设置变量名为
SSLKEYLOGFILE
, 变量值为日志文件的路径 (例如C:\Users\AceSheep\Documents\Wireshark\ssl-keys.log
)需要注意的是, 如果你创建 系统变量, 则需要使用适当的通配符或将文件存储在所有用户都可以访问的位置。例如, 你可以选择
%USERPROFILE%\App Data\ssl-keys.log
或C:\ssl-keys.log
-
完成后, 单击
确定
并转到下一步骤
设置 Linux 或 Mac 环境变量
在 Linux 或 Mac 中, 需要使用 vim
编辑器设置 SSLKEYLOGFILE
环境变量
-
打开终端, 输入以下命令编辑配置文件
- 在 Linux 中:
vim ~/.bashrc
- 在 Mac 中:
vim ~/.bash_profile
- 在 Linux 中:
-
在文件末尾添加以下行
export SSLKEYLOGFILE=~/.ssl-key.log
-
保存并退出编辑器
:wq
-
验证变量是否设置成功
echo $SSLKEYLOGFILE
执行命令后, 你应该会看到类似于上图的输出。
/Users/comparitech/.ssl-key.log
是我的 SSL 预主密钥日志的完整路径。注意: 你需要记下你的日志路径, 它会有所不同, 然后输入到 Wireshark 中 -
现在已经设置好变量了, 可以继续下一步
启动浏览器并检查日志文件
在启动 Wireshark 并将其配置为使用预主密钥解密 SSL 之前, 你应该启动浏览器并确认日志文件正在被使用
-
打开支持 SSL 的浏览器 (如 Chrome 或 Firefox)
-
打开一个启用 SSL 的网站
为了填充日志, 访问启用了 SSL 的站点非常重要。我使用自己的 Apache 服务器进行测试, 但任何站点都可以。使用预主共享密钥的最大好处之一是你 无需拥有服务器访问权限 即可解密 SSL 流量。
-
检查日志文件
访问启用 SSL 的网站后, 请检查日志文件中的数据。确认日志文件中记录了预主密钥
-
在 Windows 中, 使用记事本查看日志文件
-
在 Linux 或 Mac 中, 使用命令查看日志文件
tail -f ~/.ssl-key.log
-
在任何操作系统上, 你的文件应该看起来与上面的类似。确认浏览器正在你选择的位置记录预主密钥后, 你可以配置 Wireshark 以使用这些密钥解密 SSL
配置 Wireshark 解密 SSL
一旦你的浏览器记录了预主密钥, 就可以配置 Wireshark 使用这些日志来解密 SSL
-
打开 Wireshark, 点击
编辑
->首选项
-
在左侧展开
Protocols
-
找到并选择
SSL
-
在
(Pre)-Master-Secret log filename
字段中, 输入预主密钥日志文件的路径 -
点击
确定
保存设置
捕获会话并解密 SSL
最后一步是捕获测试会话并确保 Wireshark 成功解密 SSL
- 开启 Wireshark 的抓包功能, 捕获目标流量
- 访问 SSL 网站, 生成加密流量数据
- 在 Wireshark 中选择含加密数据的包, 切换到
解密 SSL 数据
视图即可查看解密内容
就我而言, 我将选择包含 text/HTML
编码的 HTTP 流量, 因为我想查看 Web 服务器发送到浏览器的源代码。但任何使用预主密钥或私钥的加密传输都可以使用此方法。这包括通过 Diffie-Hellman 或类似密钥交换使用完美前向加密 (PFE) 的所有数据
选择加密数据框后, 查看数据包字节视图 (Packet byte view), 特别是视图下方的选项卡。你应该会看到解密的 SSL 数据 (Decrypted SSL) 条目等
你会注意到会话仍然看起来充满垃圾, 并且看不到 HTML。这是因为我的 Web 服务器 (以及大多数 Apache 服务器) 默认使用 GZIP 压缩
单击未压缩实体主体 (Uncompressed entity body) 选项卡 (此选项卡仅在启用 SSL 解密的情况下显示) 时, 你可以查看站点的源代码。例如, 以下是默认 Apache 页面的纯文本形式的标题元素
使用服务器 RSA 私钥解密 SSL
你可能之前已经注意到, Wireshark 有一个字段允许你上传 RSA 密钥并使用它们解密 SSL。实际上, RSA 密钥解密已被弃用, 因为现代加密标准 (如 Diffie-Hellman 和 TLS 1.3) 使用完美前向保密 (PFE, Perfect Forward Encryption), 与 Diffie-Hellman 协商的会话不直接使用 RSA 密钥。而是生成一次性密钥, 仅存储在 RAM 中, 使用磁盘上的密钥进行加密。
打开 Wireshark 点击 Edit
, 选择 Preferences
. Preferences 窗口会打开, 在左侧找到 Protocols
-> SSL
-> RSA keys list
如果你之前使用 RSA 密钥解码流量, 并且它停止工作, 则可以通过启用 SSL 日志记录来确认目标机器正在使用 Diffie-Hellman 交换
要打开日志记录, 请点击工具栏菜单中的 Edit
, 然后选择 Preferences
。展开左侧的 Protocols
菜单项并向下滚动到 SSL
。从这里, 你可以点击 Browse
按钮并设置 SSL 日志的位置 (例如, C:\Users\AceSheep\Documents\Wireshark\ssl-debug.log
)
设置位置后, 所有 SSL 交互都将记录在指定的文件中
使用启用 SSL 的域名捕获会话, 然后检查日志。具体来说, 你应该滚动直到找到协商 TLS 握手的帧。你可能会在密码字符串中看到一个明显的 DHE 条目
这意味着启用了 Diffie-Hellman 密钥交换。在我的例子中, Apache 使用带有椭圆曲线 (elliptic-curve) 密钥的 Diffie-Hellman, 用字符串 ECDHE
表示
再滚动一点, 你可能会发现无法找到主密钥
如果你的日志看起来像这样, 并且你无法使用 RSA 密钥解密数据, 那么你别无选择, 只能切换到上面的预主密钥方法
由于 PFE 正在成为标准实践, 并且 TLSv1.3 可能会强制执行该问题, 因此简单的 RSA 密钥解密已被弃用, 不应使用
nginx 设置
在调试的时候需要把加密方式切换到没有 ECDHE
的套件上, 调试完成在切换回去
ssl_ciphers AES128-GCM-SHA256;
可以在这里查找 Security/Server Side TLS
原文