20

HttpsUrlConnection の Fiddler を介して Android SSL トラフィックを復号化しようとして数え切れないほどの時間を費やしてきましたが、ほとんど成功していません。HttpsUrlConnection を使用して Android アプリからの SSL トラフィックを復号化するように Fiddler を確実に構成するにはどうすればよいですか?

ここに私のステップがあります

  1. PC で Fiddler を実行します (適切な設定: HTTPS 接続のキャプチャ、HTTPS トラフィックの復号化、リモート コンピューターの接続の許可)
  2. フィドラーを実行しているPCを介してプロキシするようにAndroidデバイスでワイヤレス接続を構成します
  3. Android デバイスからブラウザーを開き、http://[ fiddler を実行している PC の IP]:8888 にアクセスし、「FiddlerRoot 証明書」をダウンロードします。名前を付けてインストールします。
  4. Android ブラウザーでhttps://www.google.comを開き、PC の Fiddler で復号化されたトラフィックを表示します。

上記の作品。問題は、ブラウザー以外の Android トラフィックが接続トンネルとして Fiddler に表示されることです。私の最初の調査では、この問題は HttpsUrlConnection を介して証明書がどのように信頼されていたかが原因であることが示唆されたため、この記事https://secure.mcafee.com/us/resources/white-papers/wp-defeating-sslに基づいてすべての証明書を信頼するようにしました。 -cert-validation.pdf

残念ながら、すべての証明書を信頼しても HttpsUrlConnection ではうまくいかなかったため、調査を中止しました。数日後、もう一度試してみることにしました。驚いたことに、フィドラー トラフィックが HttpsUrlConnection で復号化されていました。残念ながら、これを修正するための変更を加えていないため、なぜ機能し始めたのか完全にはわかりません. 動作するデバイスは LG-Optimus L9 Android バージョン 4.0.4 であり、ルート化されています。

今、私はこれをNexus 7 Androidバージョン4.2.2(ルート化されていない)用に構成しようとしていますが、悲しいことに、フィドラーに表示されるのは接続トンネルだけです。両方のデバイスの証明書には同じシリアルがあり、テストしているアプリは同一であるため、別の Android デバイスで Fiddler を構成できない理由について困惑しています。

要約する

  • Fiddler は LG Optimus からの SSL トラフィックを復号化できますが、Nexus 7 からの接続トンネルのみを表示します
  • 両方のデバイスが、ネットワーク リクエストに HttpsUrlConnection を使用する同じアプリを実行している
  • 両方のデバイスに同じフィドラー証明書がインストールされており (シリアルが一致)、他のユーザー証明書はインストールされていません。
  • これらは問題ではないと思いますが...
    • ルート化されたデバイス (LG Optimus Android 4.0.4) は、Proxy Droid を使用して、フィドラーを実行している PC をポイントします。
    • ルート化されていないデバイス (Nexus 7 Android 4.2.2) で、組み込みの「ネットワークの変更」を使用して、フィドラーを実行している PC を指す
4

3 に答える 3

25

私の調査によると、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 を再起動します

于 2014-01-16T02:10:57.073 に答える
1

これが回避策です。

https リクエストを送信するホスト名が myHostName.com であると仮定すると、Fiddler の CustomRules.js に以下を追加します。

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

次に、Android コードで、https の代わりに http を使用するように URL を更新します。

これで、クライアントは SSL なしで Fiddler と通信し、すべての要求/応答トラフィックが表示されます。

このアプローチの明らかな欠点は、http を使用するようにクライアントで URL を変更する必要があることです。私はこのアプローチを長く使っていないので、追加の欠点を発見することはできません。

于 2013-08-28T03:36:29.360 に答える