Fiddler Everywhereを使ってMac上でAndroidアプリのHTTP(S)通信をキャプチャする

導入

Androidアプリを開発していると、アプリ上でどういう通信をしているか覗きたいときありますよね。

そんなときに、よく使われるのがCharlesですが、

www.charlesproxy.com

みんな大好きFiddlerMacLinuxでも使えるFiddler Everywhereとして今年の春頃にリリースされていたのでした。

forest.watch.impress.co.jp

あまりFiddler Everywhereについての日本語記事がなかったので、
今回はMac上でFiddler Everywhereを使ってAndroidアプリのHTTP(S)通信をキャプチャするやり方について、簡単にお話します。

Fiddler Everywhereのセットアップ

まず、Fiddler Everywhereを公式サイトから適当にダウンロードしてインストールしてください。

www.telerik.com

起動しましたら、この時点でMac上のHTTP通信が丸裸にされていると思います。
f:id:Yuiki0627:20200813162406p:plain

右上の設定ボタンを押して、
HTTPS の項目で Trust root certificate します。
さらに Cpature HTTPS traffic がオンになっているか確認してください。
これでMac上にルート証明書がインストールされて、Mac上でのHTTPS通信が一度Fiddlerで赤裸々にされるようになります。
f:id:Yuiki0627:20200813161941p:plain

次に、 Connections の項目で、ポート番号を確認し、 Allow remote computers to connect にチェックを入れます。
これで他の端末がFiddlerのプロキシを利用できるようになります。
f:id:Yuiki0627:20200813161956p:plain

右下のSaveボタンを押して、Fiddler Everywhereの設定は完了です。
一回、Fiddler Everywhereを再起動しておきましょう。

Android端末のセットアップ

次に、Android端末にプロキシを設定します。
まず、Fiddler Everywhereが動いているMacIPアドレスを確認しておきます。
一番簡単なのは、System Preferences.appのNetworkで確認する方法でしょうか。

次に、HTTP(S)通信をキャプチャしたいAndroid端末をMacと同じLANに接続しておきます。
そして接続しているWi-Fiの設定を開き、プロキシを手動に切り替え、先ほど確認したIPとポート番号を入力して保存します。
f:id:Yuiki0627:20200813162949p:plain

これで当該Android端末で通信される通信がFiddler Everywhereを仲介するようになったので、
ブラウザで適当なHTTP通信を行うとFiddler Everywhereで確認できるようになったと思います。

しかし、ルート証明書をインストールしていないので、
http://ipv4.fiddler:{先ほど確認したポート番号} にアクセスし、下部リンクからルート証明書をダウンロードして、 適当な名前を付け、端末にインストールさせてください。

これでAndroid上のブラウザで適当なHTTPS通信をすると、Fiddler EverywhereでHTTP(S)通信を閲覧できるようになったと思います。

Androidアプリの設定

とはいえ、プロキシ設定のダイアログに書いてあった通り、ブラウザ以外のアプリではプロキシが利用できないので、
開発しているアプリ上の設定を弄ります。

まず、以下の内容のファイル res/xml/network_security_config.xml を作成してください。

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="user" />
        </trust-anchors>
    </debug-overrides>
</network-security-config>

次に AndroidManifest.xmlapplication に以下のプロパティを追加します。

<application
    ...
    android:networkSecurityConfig="@xml/network_security_config">
   ...

これで当該アプリをデバッグ実行すると、Fiddler EverywhereでHTTPS通信が見れるようになったはずです。