ソフトウェア開発でhttpリクエストを送ることはよくあると思うが、その中身をチェック・デバッグするにはどうするか。
もちろん開発しているツールで中身を見てもいいし、ログを仕込んでもいいと思うが、場合によっては少し手間がかかったりもするしリアルタイムで把握しづらかったりもする。
通信の間にプロキシを介在させればHttpリクエスト、レスポンスの中身がプロクシにより取得できるので便利である。
色々とツールはあるが無料で機能が豊富なmitmproxyを使う。これをmac上で動かし、別のiOSデバイス(iPhoneなど)からインターネットへのアクセスを仲介してみる。実際に試してみたが、手軽に素早くリクエスト・レスポンスをチェックできるため、デバッグの速度が上がり何よりストレスが減った。1
他のツールを探したい場合 -> アプリのAPIリクエストのトレースはどうするのが効率的か?
インストール
Homebrewというツールを使いインストールする。
brew install mitmproxy
mac以外のデバイス上で動かすときは-> Installation - mitmproxy
起動
ターミナルで以下のコマンドを叩くと、mitmproxyが起動する。
mitmproxy
後で使うので、macのプライベートネットワーク内のIPアドレスを調べておく。
ifconfig
以上のように入力すると、出力のen=0
という欄にipアドレスが記載されている。例えば、192.168.100.107など。詳細
iOSデバイス側
「設定」アプリを開く。Wi-Fi > 現在使用しているWi-fiの横にある「i」ボタン > HTTPプロクシ > 手動
「サーバー」の欄に、macのipアドレスを入力する。
「ポート番号」の欄には、mitmproxyのポート番号(特に何も指定しなければ、デフォルトでは8080)を入力する。
次にiOSデバイスにmitmproxyの証明書をDLする。
Safariからhttp://mitm.itにアクセスし、Appleのりんごのマークをタップする。
「設定」アプリを開き、一般 > プロビジョニング でmitmproxyのプロファイルが追加されているはずなので、タップして認証する。
以降、iOSデバイス側からのHTTPリクエスト、およびiOSデバイスが受け取るHTTPレスポンスがmitmproxyに一覧表示される。
なお、App storeからアプリをダウンロードするにはプロキシがあるとできないようなので、その前にプロクシの設定を一度解除する必要がある。
macを使う場合
mitmproxy自体を起動しているMacのトラフィックを見るという事もできる。
また、Xcodeのシミュレータでアプリなどを起動し、そのトラフィックを見たい場合、シミュレータ独自のプロクシの設定はできないことから、やはりmitmproxy自体を起動しているMacのトラフィックを見るよう設定する事になる。
Intercepting Network Traffic with mitmproxy
mac全体のプロキシ設定を変更することとなる。いちいち手動で設定を変更するのは面倒かと思うので、シェルスクリプト を使い変更すると楽。
#!/bin/sh
# turn on mitmproxy wifi settings
networksetup -setwebproxy "Wi-fi" 0.0.0.0 8080
networksetup -setsecurewebproxy "Wi-fi" 0.0.0.0 8080
#!/bin/sh
# turn off mitmproxy wifi settings back to default settings
networksetup -setwebproxystate "Wi-fi" off
networksetup -setsecurewebproxystate "Wi-fi" off
その後、シミュレータに証明書をインストールする。
ターミナルで以下のコマンドを叩く。
curl -O https://raw.githubusercontent.com/ADVTOOLS/ADVTrustStore/master/iosCertTrustManager.py
chmod 744 ./iosCertTrustManager.py
./iosCertTrustManager.py -a ~/.mitmproxy/mitmproxy-ca-cert.pem
rm ./iosCertTrustManager.py
Mac自体のSafariなどのトラッキングもしたければ、Mac自体にも証明書をインストールする。MacのSafariからmitm.itにアクセスし、そのページの指示に従い、MacOS用の証明書をインストールし、信用する。
参考: mitmproxyでiOS Simulatorを覗くためのメモ
各リクエストの詳細
クリックすると各リクエストの詳細が見れる。
「q」キーで一覧画面に戻る。
「F」キーで最新のリクエストを自動で追いかける。
フィルタリング
「f」キーで、一定の文字列でフィルタリングを行う。
保存
普通にマウスでドラッグしようとすると画面に説明が表示されるが、その説明の通りで、macの場合はFnキーを押しながらドラッグすると画面を選択できるので、画面に表示されるものをコピーできる。
またbキーを押し、保存先のパスを入力し、エンターキーを押すとそのファイルに保存もできる。
デフォルトのresponse.content を書き換えると、以下のものが保存される。
request : リクエスト方法とURLが保存される
request.headers : リクエストヘッダが保存される
request.content : リクエストパラメータが&で繋がれて保存される
response : レスポンス結果(404とか302とか)が保存される
response.headers : レスポンスヘッダが保存される
response.content : レスポンスパラメータが&で繋がれて保存される
ただ全ログをファイルに書き込みたい時にはあまり向かないので、後述のmitmdumpを使った方がいい。
mitmdump
基本的にはmitmproxyと同じだがログをダンプするには向いている。
基本
mitmdump
でmitmproxyと同様に起動する
ログの保存
mitmdump -w (ファイル名)
で、ファイルにログを全て書き込む。
フィルタリング
mitmdump -w (ファイル名) FILTER
FILTER部分にフィルタリング用の表現を書き込む。
mitmproxy docs - filter expressions
mitmdump -w (ファイル名) "~m post"
HTTPメソッドがPOSTのもののみ書き込む。
mitmdump -w (ファイル名) "~u hogehoge"
URLにhogehoge
を含むもののみ書き込む。
参考
mitmproxy docs
モバイルアプリ開発者のための mitmproxy 入門
iOS実機のSSL通信をプロキシによって傍受したり改ざんする方法