如何通过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。

关键字:

HTTPSHTTP/2SSL/TLS