Android エミュレータ上で動いているアプリの HTTP / HTTPS 通信の中身を見る方法
今回は Android エミュレータでアプリを動かして、アプリが行う HTTP / HTTPS 通信の中身を覗いてみます。
環境&ツール
- Windows 10
- Android Studio のエミュレータ (v3.2.1)
- mitmproxy (v4.0)
準備
ツールのインストール
Android Studio と mitmproxy をインストールしてください。
仮想デバイスの作成
私は以下の構成で仮想デバイスを作成しました。
ハードウェア
- Pixel 2
システムイメージ
※ Android9.0 (Google Play) と書かれたイメージだと adb root
が使えないで、 Android9.0 (Google APIs) と書かれたイメージを選択してください。
証明書の書き込み
Android API レベルが 24 以上の場合、ネイティブアプリはシステムレベルの証明書のみ信頼するので、直接証明書を書き込む必要があります。
まずは mitmproxy を立ち上げて、ブラウザのプロキシの設定をしてから http://mitm.it
にアクセスして Android 用の証明書をダウンロードしてください。
mitmproxy はデフォルトで 127.0.0.1:8080
で起動します。
Android では、証明書を <subject_hash_old>.0
といった形式で保存しているので、証明書のサブジェクトのハッシュ値を求めて、ファイル名を変更してください。
$ openssl x509 -inform PEM -subject_hash_old -in mitmproxy-ca-cert.pem
ファイル名を変更したら、ファイルを書き込みます。Android では証明書を /system/etc/security/cacerts
に保存しているのですが /system
以下は通常 read only なので、エミュレータを起動するときに -writable-system
オプションをつけて起動させます。
$ emulator -avd [avd] -writable-system $ adb root $ adb remount $ adb push <subject_hash_old>.0 /system/etc/security/cacerts/ $ adb shell generic_x86:/ $ chmod 644 /system/etc/security/cacerts/<subject_hash_old>.0 generic_x86:/ $ exit $ adb reboot
通信を覗く
最初に mitmproxy ui を起動させます。
次に Android エミュレータを起動させます。起動させるときは -writable-system
オプションと -http-proxy
オプションをつけます。
$ emulator -avd [avd] -writable-system -http-proxy 127.0.0.1:8080
mitmproxy の Web Interface を見てみると、アプリが行っている通信が表示されているはずです。