如何通过Wireshark查看HTTPS、HTTP/2网络包(解码TLS、SSL)
2015年12月15日

最近正在做 HTTP/2 相关的研究,由于目前所有的浏览器仅支持在 HTTPS 上使用 HTTP/2,所以通过 Wireshark 只能查看到加密后的 TLS 网络包。其实 Wireshark 提供了一些设置允许我们解码 TLS、SSL 网络包。

加密的TLS网络包

用服务器证书私钥解码

第一种方法是:使用服务器证书的私钥进行解码。

在 IIS 上导出服务器证书私钥

第一步我们需要从网站服务器上导出证书私钥,这里拿 IIS 服务器举例。

  1. 打开 IIS 站点所绑定的服务器证书,点击查看 详细信息 页,点击 复制到文件

    查看证书详情页->复制到文件

  2. 向导中点击下一步,当询问是否导出私钥时选择 是,导出私钥,点击 下一步 继续。

    是,导出私钥

  3. 选择 个人信息交换(.PFX),下面的三个复选框不用勾选,点击 下一步 继续。

    个人信息交换(.PFX)

  4. 勾选 密码,设置一个密码,点击 下一步 继续,导出 PFX 文件。

    设置密码

Wireshark 中设置以服务器证书私钥解码 SSL 协议

有了 PFX 私钥文件,接下来就可以通过 Wireshark 设置使用该私钥来解码 SSL、TLS 网络包了。这一步既可以在服务器上的 Wireshark 中设置,也可以在客户端的 Wireshark 中设置,取决于你想在哪一端查看(抓取)网络包。

  1. 在 Wireshark 中,进入菜单 Edit -> Preferences...

  2. 展开 Protocols -> SSL,点击 Edit 按钮编辑 RSA key lists

    点击Edit编辑RSA key lists

  3. 配置如下:

    • IP address:目标服务器的 IP 地址,也可以填写 "any" 应用到所有 IP 地址。
    • Port:HTTPS 端口号,一般均为:"443"。
    • Protocol:填写 "http"。
    • Key File:选取刚才导出的服务器证书私钥(PFX 文件)。
    • Password:输入服务器证书私钥的密码。

设置完成后,当前正在查看的网络包或将来抓取的网络包就会以设定的规则解码了。

解码后的TLS网络包

如果网络包依然无法被解码,那么很有可能是因为服务器和客户端之间使用了 Diffie-Hellman 加密算法。

禁用 Diffie-Hellman

如果在 SSL、TLS 握手过程中发现服务器返回的 Server Hello 所选择的加密算法带有 "ECDHE" 和 "DHE" 关键字,那就说明当前 SSL Session 使用了 Diffie-Hellman 加密算法。

使用了Diffie-Hellman加密算法

使用了 Diffie-Hellman 的 TLS Session Key 会用一个动态产生的密钥对进行加密,而不是使用证书的公钥加密,所以 Wireshark 依然无法解码 TLS 网络包。解决方案就是:禁用客户端或服务器的 Diffie-Hellman 加密算法,建议禁用客户端的 Diffie-Hellman 加密算法仅供网络包分析,这样依然可以保持网站服务器的安全性。

以下是从 Windows 客户端禁用三种不同浏览器 Diffie-Hellman 加密算法的方法以及禁用 IIS 服务器 Diffie-Hellman 加密算法,只要任选其一保证 SSL Session 不使用 Diffie-Hellman 加密算法即可。

禁用 Internet Explorer 的 Diffie-Hellman 加密算法
  1. 运行 gpedit.msc 打开本地组策略编辑器。

  2. 编辑设置:计算机配置 -> 管理模板 -> 网络 -> SSL 配置设置 -> SSL 密码套件顺序

  3. 启用该设置后,复制文本框中的默认值到写字板或编辑器中。

    启用设置:SSL密码套件顺序

  4. 删除所有带 "ECDHE" 和 "DHE" 的算法,请保持所有的文本都在一行里。

    删除所有带ECDHE和DHE的算法

  5. 将修改后的值替换原有的默认值,点击确定后保存,重启计算机。

  6. 重启后,再次抓包发现 IE 发出的 Client Hello 中已经不包含任何 Diffie-Hellman 加密算法了,并且 Wireshark 已经能成功将 TLS、SSL 网络包解码。

    Client Hello中已不包含任何Diffie-Hellman加密算法

禁用 Chrome 的 Diffie-Hellman 加密算法
  1. 查看默认 Chrome 发出的 Client Hello 包中所包含的 Cipher Suites 列表。

    Cipher Suites (15 suites)
         Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b)
         Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
         Cipher Suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (0x009e)
         Cipher Suite: TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (0xcc14)
         Cipher Suite: TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xcc13)
         Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a)
         Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)
         Cipher Suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x0039)
         Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009)
         Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)
         Cipher Suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA (0x0033)
         Cipher Suite: TLS_RSA_WITH_AES_128_GCM_SHA256 (0x009c)
         Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)
         Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA (0x002f)
         Cipher Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA (0x000a)
    
  2. 将所有带 "ECDHE" 和 "DHE" 的算法的十六进制表达连接成字符串赋给 "--cipher-suite-blacklist" 参数,在启动 Chrome 时添加这个参数。如:

    c:\Program Files (x86)\Google\chrome\Application\chrome.exe --cipher-suite-blacklist=0xc02b,0xc02f,0x009e,0xcc14,0xcc13,0xc00a,0xc014,0x0039,0xc009,0xc013,0x0033

  3. 启动后,再次抓包可以看到 Chrome 发出的 Client Hello 包中已经不包含任何 Diffie-Hellman 加密算法了。

    Cipher Suites (4 suites)
        Cipher Suite: TLS_RSA_WITH_AES_128_GCM_SHA256 (0x009c)
        Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)
        Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA (0x002f)
        Cipher Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA (0x000a)
    
禁用 Firefox 的 Diffie-Hellman 加密算法

打开 Firefox,地址栏输入 "about:config",搜索 "dhe",双击搜到的所有 Diffie-Hellman 算法将其 Value值改为 false, 重启 Firefox 即可生效。

禁用 IIS 服务器的 Diffie-Hellman 加密算法
  1. 以管理员权限打开 regedit,双击编辑:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002\Functions

  2. 将所有带 "ECDHE" 和 "DHE" 的算法删除。

    将所有带ECDHE和DHE的算法删除

  3. 保存更改,重启服务器即可。

用 SSLKEYLOGFILE 解码

第二种解码 TLS、SSL 的方法是:设置环境变量 SSLKEYLOGFILE,将其指向一个可写入的文本文件。Chrome 和 Firefox 在启动时会检查这个环境变量,如果存在的话,它会向指定的文件写入访问 HTTPS 站点时使用的密钥。我们可以在客户端配置 Wireshark 读取这个文件来解码 TLS、 SSL 网络包。

  1. 右键计算机,查看属性,打开高级系统设置,查看高级选项卡,点击环境变量

    右键计算机,查看属性,打开高级系统设置,查看高级选项卡,点击环境变量。

  2. 新建一个系统变量

    新建一个系统变量

  3. 指定变量名为:SSLKEYLOGFILE,变量值为一个可写入的文本文件。文件夹必须提前创建,若文件尚未创建,可以打开 Chrome 或 Firefox 一下,文件会被自动创建。

    变量名:SSLKEYLOGFILE,变量值:一个可写入的文本文件

  4. 在 Wireshark 中,进入菜单 Edit -> Preferences...

  5. 展开 Protocols -> SSL,将 (Pre)-Master-Secret log filename 设为步骤 3 中指定的值。

    在Wireshark中设置(Pre)-Master-Secret log filename为SSLKEYLOGFILE的值

  6. 点击确认后,就会正确解码 HTTPS 网络包了。使用 SSLKEYLOGFILE 的好处就是它可以解 Diffie-Hellman 加密算法。

总结

本文介绍了两种在 Wireshark 中解码 TLS、SSL 的方法,你可以斟酌它们的优缺点选择最适合你的方法。

  1. 服务器私钥

    优点:

    • 既可在客户端使用,又可以在服务端使用。
    • 支持各种浏览器。

    缺点:

    • 需要得到服务器证书。
    • 不支持 Diffie-Hellman 加密算法。
  2. SSLKEYLOGFILE

    优点:

    • 支持 Diffie-Hellman 加密算法。
    • 不需要取得服务器证书。

    缺点:

    • 只能在客户端使用。
    • 只支持 Chrome 和 Firefox。