应用程序抓Https包

作为后端经常与客户端进行Http接口的联调,虽然客户端有日志记录,但仍没有直接抓包来的准确直观,目前常用的抓包工具有fiddlerwireshark。fiddler小而精仅提供Web相关的抓包功能,而wireshark大而全提供全方位的抓包能力。下面就来看看这两个工具

wireshark

我个人比较偏爱大而全所以选择了wireshark,但其有个缺点就是在解Https包时需要特殊配置,下面就来介绍介绍。

解包原理

关于wireshark如何解Https包在其官方文档已有提及,其通过密钥日志文件来实现解密能力。密钥日志文件是一种通用机制,即便使用的是Diffie-Hellman(DH)密钥交换,可以实现解密。在设置SSLKEYLOGFILE环境变量后Firefox,Chrome和curl等应用程序在访问Https站点时就会生成会话密钥的文本文件,确切地说,是它们使用的基础库(NSS,OpenSSL或boringssl)会将所需的每个会话密钥写入文件中,接着在wireshark中设置密钥日志文件即可实现数据的解密。

配置步骤

其配置步骤如下:

  • 完全关闭所有的待抓包应用
  • 在电脑的环境变量中添加SSLKEYLOGFILE并指向一个可写的文件,例如:D:\tmp\keylogfile.txt
  • 打开待抓包应用
  • 验证步骤2里的文件是否创建,如2例子为:D:\tmp\keylogfile.txt
  • 打开wireshark编辑 -> 首选项 -> Protocols -> TLS,将Pre)-Master-Secret log filename 设置为步骤2的文件路径
  • 打开wireshark抓包
  • 应用请求Https地址
  • 用tls或者http过滤器,检查解密后的数据是否可见

官方文档里不推荐在步骤2里设置全局环境变量,因为它会允许解密所有TLS流量,因此可能导致安全问题。所以更好方法是通过批处理文件临时设置环境变量。可以使用以下命令创建文件start.cmd:

1
2
3
@echo off
set SSLKEYLOGFILE=D:\tmp\keylogfile.txt
start chrome # 可以是任意支持的应用

接着对应用程序进行抓包即可实现数据解密查看。

解包失败

使用过程中我发现公司旧版PC客户端即使设置SSLKEYLOGFILE也不会生成密钥日志文件,导致wireshark解包失败,而新版可以正常生成,这说明旧版基础库不支持密钥日志文件的生成,这样就无法使用wireshark解包。其实官方文档还介绍了另外一种方式,RSA私钥文件进行解密,但遗憾的是在DH密钥交换场景下,无法发挥作用,这里就不做介绍了。

fiddler

fiddler对与Https的解包使用就比较简单,下载安装fiddler后在菜单Tools -> Options,选择HTTPS页签,勾选上Decrypts HTTPS traffic即可支持Https的抓包。fiddler还提供了一个HTTP代理服务,所以对于允许支持指定代理的客户端应用也可以实现抓包,但是有些应用并未开放指定HTTP代理的设置项,这时可以用其他软件将应用强制使用HTTP代理,其中个人使用过并觉得不错的是Proxifier,这是一款功能强大代理软件,其使用大致方式如下:

  • 添加代理服务器
    • 菜单栏 —> “Profile” —> “Proxy Server…”
    • 点击 “Add…” 按钮后,输入fiddler代理服务ip 127.0.0.1、port 8888,Protocol 选择 HTTPS
  • 添加代理规则
    • 菜单栏 —> “Profile” —> “Proxification Rules..”
    • 代理规则里,”Add…” 添加规则,输入规则名称,Applications 填待代理的应用,Target HOSTS 填服务地址, Traget PORTS 填443,Action指定为刚刚添加的Proxy Server
    • 默认的Default规则选择direct
  • 打开应用检查fiddler抓包情况

值得注意的是Proxifier是付费软件,提供了31天的试用,虽然网上提供了激活码或是破解版本,但开发不易还请多支持正版。

写在最后

关于抓包个人觉得还是挺有必要了解学习一下,这样可以快速定位处理问题,有助于提升开发效率,希望这篇日志的内容能帮到各位。