mitmproxyの使い方
アプリケーションのデバッグ時に通信内容を覗いたり、テスト時にリクエスト内容を書き換えるのに便利なmitmproxyの使い方のメモです。
Table of Contents
mitmproxyのインストールと起動
ref. Installation - mitmproxy docs
# macOS
brew install mitmproxy
# or Arch Linux
pacman -S mitmproxy
# or Python Package Index
pipx install mitmproxy
mitmproxy
# or
mitmproxy -p 8080
証明書とプロキシの設定 (Android)
※ 以下の方法ではブラウザ (Chrome) の通信しかプロキシできません。 アプリの通信プロキシするには、証明書をrootのファイルシステム上に配置するか、 APKを書き換える必要があります。
設定 > ネットワークとインターネット > インターネット > 利用しているWifiの⚙️アイコン > 詳細設定
mitmproxyを動かしているマシンのIPアドレス、ポートを設定する。
HTTPSの通信をプロキシするにはAndroid端末に証明書を設定する必要があります。
http://mitm.itにAndroidのChromeでアクセスすると、各クライアント向けの証明書と設定方法が参照できます。ここからAndroid向けの証明書をダウンロードします。
このページの下にも書いてあるとおり、この証明書をインストールしても他のユーザから通信を覗かれるようなことはありません。
- このページや証明書のファイルはmitmproxyを動かしてるマシンから返しています。
- ここからダウンロードできる証明書はmitmproxy初回起動時にランダムに生成されたものです。
設定 > セキュリティ > 詳細設定 > 暗号化と認証情報 > 証明書のインストール > CA証明書を選択して、ダウンロードした証明書をインストールします。
証明書とプロキシの設定 (Archlinux / GNOME)
Settings > Network > Network Proxy
Androidと同じようにmitm.itから証明書をダウンロードしてインストールします。 ref. Grawity/Adding a trusted CA certificate - Arch Linux Wiki
sudo trust anchor --store ./mitmproxy-ca-cert.pem
アンインストールするときは、
sudo trust anchor --remove ./mitmproxy-ca-cert.pem
mitmproxyの操作方法
key / command | 説明 |
---|---|
h,j,k,l | カーソル移動 |
? | ヘルプ |
q | 戻る |
f | フィルタ (ドメインやリクエスト/レスポンスの内容でフィルタできる) |
:export.clip curl @focus | 選択中のリクエストをcurlコマンドとしてクリップボードにコピーする |
ショートカットの設定
# ~/.mitmproxy/keys.yaml
-
key: c
ctx: ["flowlist"]
cmd: export.clip curl @focus
help: Export a flow as a curl command to the clipboard.
ref. Keyboard shortcut for copying URL/curl command/etc. #2649
通信内容を書き換える
このようなPythonスクリプトを用意して、起動時に指定することでリクエスト・レスポンスの内容を書き換えることができます。
# client_hints_override.py
from mitmproxy import http
class ClientHintsOverride:
def request(self, flow: http.HTTPFlow) -> None:
flow.request.headers["sec-ch-ua-platform"] = "Windows"
flow.request.headers["sec-ch-ua-platform-version"] = "10"
addons = [ClientHintsOverride()]
mitmproxy -s ./client_hints_override.py