使用 Wireshark 解密 SSL

SSL 和 TLS 网站调试

Wireshark 是一款广泛使用的网络协议分析工具, 它能够帮助我们分析和调试网络流量。在分析 SSL/TLS 流量时, Wireshark 可以帮助我们查看加密的数据, 但前提是我们需要提供密钥或会话信息。

使用预主密钥解密 SSL 和 TLS

在 Wireshark 中使用预主密钥 (pre-master secret key) 解密 SSL 和 TLS 流量是推荐的方法。预主密钥由客户端生成, 服务器使用该密钥派生出用于加密会话流量的主密钥。这种方法通过 Diffie-Hellman 实现, 是目前的加密标准。

你的浏览器可以记录预主密钥日志, Wireshark 可利用这些日志解密 SSL 和 TLS 会话

设置 Windows 环境变量

在 Windows 系统中, 需要设置名为 SSLKEYLOGFILE 的环境变量, 用于指定预主密钥日志文件的存储路径

  1. 首先右键单击 我的电脑, 然后从菜单中选择 属性

    Windows 属性

  2. 点击左侧的 高级系统设置

    Windows Control

  3. 系统属性 窗口的 高级 选项卡中, 点击 环境变量

    Windows System

  4. 用户变量 下, 点击 新建。如果你想为系统上的每个用户记录 SSL 密钥, 你也可以在 系统变量 下创建变量, 但我更喜欢将其限制在我的个人资料中。

    Environment Variables

  5. 设置变量名为 SSLKEYLOGFILE, 变量值为日志文件的路径 (例如 C:\Users\AceSheep\Documents\Wireshark\ssl-keys.log)

    New user Variable

    需要注意的是, 如果你创建 系统变量, 则需要使用适当的通配符或将文件存储在所有用户都可以访问的位置。例如, 你可以选择 %USERPROFILE%\App Data\ssl-keys.logC:\ssl-keys.log

  6. 完成后, 单击 确定 并转到下一步骤

设置 Linux 或 Mac 环境变量

在 Linux 或 Mac 中, 需要使用 vim 编辑器设置 SSLKEYLOGFILE 环境变量

  1. 打开终端, 输入以下命令编辑配置文件

    • 在 Linux 中: vim ~/.bashrc
    • 在 Mac 中: vim ~/.bash_profile
  2. 在文件末尾添加以下行

    export SSLKEYLOGFILE=~/.ssl-key.log
    
  3. 保存并退出编辑器 :wq

  4. 验证变量是否设置成功

    echo $SSLKEYLOGFILE
    

    SSL Key Log File

    执行命令后, 你应该会看到类似于上图的输出。/Users/comparitech/.ssl-key.log 是我的 SSL 预主密钥日志的完整路径。注意: 你需要记下你的日志路径, 它会有所不同, 然后输入到 Wireshark 中

  5. 现在已经设置好变量了, 可以继续下一步

启动浏览器并检查日志文件

在启动 Wireshark 并将其配置为使用预主密钥解密 SSL 之前, 你应该启动浏览器并确认日志文件正在被使用

  1. 打开支持 SSL 的浏览器 (如 Chrome 或 Firefox)

  2. 打开一个启用 SSL 的网站

    为了填充日志, 访问启用了 SSL 的站点非常重要。我使用自己的 Apache 服务器进行测试, 但任何站点都可以。使用预主共享密钥的最大好处之一是你 无需拥有服务器访问权限 即可解密 SSL 流量。

    Secure Connection

  3. 检查日志文件

    访问启用 SSL 的网站后, 请检查日志文件中的数据。确认日志文件中记录了预主密钥

    • 在 Windows 中, 使用记事本查看日志文件

      SSL Keys Log

    • 在 Linux 或 Mac 中, 使用命令查看日志文件

      tail -f ~/.ssl-key.log
      

在任何操作系统上, 你的文件应该看起来与上面的类似。确认浏览器正在你选择的位置记录预主密钥后, 你可以配置 Wireshark 以使用这些密钥解密 SSL

配置 Wireshark 解密 SSL

一旦你的浏览器记录了预主密钥, 就可以配置 Wireshark 使用这些日志来解密 SSL

  1. 打开 Wireshark, 点击 编辑 -> 首选项

  2. 在左侧展开 Protocols

    Wireshark Protocols

  3. 找到并选择 SSL

    SSL Keys

  4. (Pre)-Master-Secret log filename 字段中, 输入预主密钥日志文件的路径

  5. 点击 确定 保存设置

捕获会话并解密 SSL

最后一步是捕获测试会话并确保 Wireshark 成功解密 SSL

  1. 开启 Wireshark 的抓包功能, 捕获目标流量
  2. 访问 SSL 网站, 生成加密流量数据
  3. 在 Wireshark 中选择含加密数据的包, 切换到 解密 SSL 数据 视图即可查看解密内容

就我而言, 我将选择包含 text/HTML 编码的 HTTP 流量, 因为我想查看 Web 服务器发送到浏览器的源代码。但任何使用预主密钥或私钥的加密传输都可以使用此方法。这包括通过 Diffie-Hellman 或类似密钥交换使用完美前向加密 (PFE) 的所有数据

Wireshark Logfile

选择加密数据框后, 查看数据包字节视图 (Packet byte view), 特别是视图下方的选项卡。你应该会看到解密的 SSL 数据 (Decrypted SSL) 条目等

Segment data

你会注意到会话仍然看起来充满垃圾, 并且看不到 HTML。这是因为我的 Web 服务器 (以及大多数 Apache 服务器) 默认使用 GZIP 压缩

Decrypted file

单击未压缩实体主体 (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

SSL Decrypt

如果你之前使用 RSA 密钥解码流量, 并且它停止工作, 则可以通过启用 SSL 日志记录来确认目标机器正在使用 Diffie-Hellman 交换

要打开日志记录, 请点击工具栏菜单中的 Edit, 然后选择 Preferences。展开左侧的 Protocols 菜单项并向下滚动到 SSL。从这里, 你可以点击 Browse 按钮并设置 SSL 日志的位置 (例如, C:\Users\AceSheep\Documents\Wireshark\ssl-debug.log)

SSL Debug

设置位置后, 所有 SSL 交互都将记录在指定的文件中

使用启用 SSL 的域名捕获会话, 然后检查日志。具体来说, 你应该滚动直到找到协商 TLS 握手的帧。你可能会在密码字符串中看到一个明显的 DHE 条目

Cipher file

这意味着启用了 Diffie-Hellman 密钥交换。在我的例子中, Apache 使用带有椭圆曲线 (elliptic-curve) 密钥的 Diffie-Hellman, 用字符串 ECDHE 表示

再滚动一点, 你可能会发现无法找到主密钥

Debug file

如果你的日志看起来像这样, 并且你无法使用 RSA 密钥解密数据, 那么你别无选择, 只能切换到上面的预主密钥方法

由于 PFE 正在成为标准实践, 并且 TLSv1.3 可能会强制执行该问题, 因此简单的 RSA 密钥解密已被弃用, 不应使用

nginx 设置

在调试的时候需要把加密方式切换到没有 ECDHE 的套件上, 调试完成在切换回去

ssl_ciphers AES128-GCM-SHA256;

可以在这里查找 Security/Server Side TLS


原文

How to Decrypt SSL with Wireshark – HTTPS Decryption Guide

最后更新于 2024-11-28
使用 Hugo 构建
主题 StackJimmy 设计