【问题标题】:Fiddler - Decrypt Android HttpsUrlConnection SSL trafficFiddler - 解密 Android HttpsUrlConnection SSL 流量
【发布时间】:2013-05-27 14:34:39
【问题描述】:

我花了无数个小时试图通过 Fiddler 为 HttpsUrlConnection 解密 Android SSL 流量,但收效甚微。如何可靠地配置 Fiddler 以使用 HttpsUrlConnection 解密来自 Android 应用的 SSL 流量?

这是我的步骤

  1. 在 PC 上运行 Fiddler(使用适当的设置:捕获 HTTPS 连接、解密 HTTPS 流量、允许远程计算机连接)
  2. 将 Android 设备上的无线连接配置为通过运行 fiddler 的 PC 进行代理
  3. 从安卓设备打开浏览器到运行fiddler的电脑的http://[ip]:8888并下载“FiddlerRoot证书”。命名并安装它。
  4. 在安卓浏览器中打开https://www.google.com,在PC端的Fiddler中查看解密后的流量。

以上工作。问题是非浏览器 android 流量在 Fiddler 中显示为连接隧道。我最初的研究表明这个问题是由于证书是如何通过 HttpsUrlConnection 被信任的,所以我根据这篇文章确保信任所有证书https://secure.mcafee.com/us/resources/white-papers/wp-defeating-ssl-cert-validation.pdf

不幸的是,使用 HttpsUrlConnection 信任所有证书对我不起作用,所以我停止了调查。几天后,我决定再试一次,惊讶地发现 fiddler 流量正在为 HttpsUrlConnection 解密!不幸的是,我没有进行任何进一步的更改来解决这个问题,所以我不完全确定它为什么开始工作。它使用的设备是 LG-Optimus L9 Android 版本 4.0.4 并且已植根。

现在我正在尝试为 Nexus 7 Android 版本 4.2.2(未植根)配置此功能,但可惜我在提琴手中看到的只是连接隧道。由于两台设备上的证书具有相同的序列号,而且我正在测试的应用程序相同,我很难理解为什么我不能用另一台 Android 设备配置 Fiddler。

总结

  • Fiddler 可以解密来自 LG Optimus 的 SSL 流量,但只显示来自 Nexus 7 的连接隧道
  • 两台设备都运行同一个应用,该应用使用 HttpsUrlConnection 进行网络请求
  • 两台设备都安装了相同的提琴手证书(序列匹配),并且没有安装其他用户证书。
  • 不要认为这些很重要,但是...
    • root 设备 (LG Optimus Android 4.0.4) 使用 Proxy Droid 指向运行 fiddler 的 PC
    • 使用内置“修改网络”指向运行提琴手的 PC 的无根设备 (Nexus 7 Android 4.2.2)

【问题讨论】:

  • 在 Nexus 上,Chrome 流量会被解密吗?未显示的网络请求是否失败或只是在没有显示其流量的情况下工作?您使用的是默认证书制作者还是证书制作者插件?
  • Chrome 流量与两台设备上的任何其他基于 webview 的流量都可以很好地解密。通过 HttpsUrlConnection 在 Nexus 上的网络请求失败,我在 Fiddler 中看到的只是连接隧道。关于 Fiddler 中的证书制作者问题 HTTPS 选项说“使用 C:\Program Files(x86)\Fiddler2\CertMaker.dll 中的 CertMaker.BCCertMaker 生成的证书”。我不确定这是默认证书还是插件。

标签: android fiddler httpsurlconnection


【解决方案1】:

我的研究表明,HttpsUrlConnection 管道实现存在错误。

要解决问题,您需要在 Fiddler 中执行以下步骤:

  1. 在 Fiddler 中点击“规则->自定义规则”;

  2. 在打开的脚本中找到函数 OnBeforeResponse

  3. 在函数体中添加如下代码:

    if (oSession.oRequest["User-Agent"].indexOf("Dalvik") > -1 && oSession.HTTPMethodIs("CONNECT")) {  
       oSession.oResponse.headers["Connection"] = "Keep-Alive";     
    } 
    

4.保存文件并重启Fiddler

【讨论】:

  • 谢谢,但是当我尝试发送请求时,提琴手抛出并错误提示:您的提琴手脚本有问题。你调用的对象是空的。在 Fiddler.HTTPHeaders.set_Item(String HeaderName, String value) 在 Fiddler.ScriptNamespace.Handlers.OnBeforeRequest(Session oSession) 在 Fiddler.FiddlerScript.DoBeforeRequest(Session oSession)
  • 看起来您在 OnBeforeRequest 而不是 OnBeforeResponse 中添加了代码
  • 很好的解决方案 - 谢谢。此外,当从 Android 发出 GoogleAuthUtil 调用时,用户代理是“GoogleAuth/1.4”,因此如果您希望同样的解决方案也能够解密这些调用,请添加额外的用户代理字符串:if ( (oSession.oRequest["User-Agent"].indexOf("Dalvik") > -1 || oSession.oRequest["User-Agent"].indexOf("GoogleAuth") > -1) && oSession.HTTPMethodIs(" CONNECT")) { oSession.oResponse.headers["Connection"] = "Keep-Alive"; }
  • 我尝试这样做后出现这样的错误:FiddlerScript Compiler error --------------------------- Type string' 不包含string' could be found. Are you missing an assembly reference? Line: 284 类型的indexOf' and no extension method indexOf' 的定义
  • 在 Android 4.2.2 和 Android 5.0 Genymotion 模拟器上测试 - Fiddler 在 Linux 上不起作用,隧道 https 流量。切换到Charles 代理,安装了它的根证书,一切正常。虽然它不是免费的......
【解决方案2】:

这是一种解决方法。

假设我发送 https 请求的主机名是 myHostName.com,请将以下内容添加到 Fiddler 的 CustomRules.js

if (!oSession.isHTTPS && !oSession.HTTPMethodIs("CONNECT") && (oSession.HostnameIs("myHostName"))
{
  oSession.oRequest.headers.UriScheme = "https";
}

然后在 Android 代码中更新 URL 以使用 http 而不是 https。

现在客户端将在不使用 SSL 的情况下与 Fiddler 通信,并且所有请求/响应流量都将可见。

这种方法的明显缺点是必须在客户端修改 URL 才能使用 http。我使用这种方法的时间还不够长,还没有发现任何其他缺点。

【讨论】:

    【解决方案3】:

    让设备植根是关键。至少在我的场景中。

    我取消了 LG Optimus Android 4.0.4 的根目录并将其升级到 4.1.2。我试过 fiddler 将所有相同的步骤,但只显示连接隧道。

    我再次扎根了 LG Optimus,我立即可以通过 fiddler 看到所有请求/响应。

    我认为 N7 的 root 也可以让它工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      • 2015-01-16
      • 2012-09-15
      • 2021-02-26
      相关资源
      最近更新 更多