mitmproxyでかなりハマった話

eyecatching_mitmproxy-certificate-trap プログラミング
この記事は約6分で読めます。
mitmproxyで通信を解析したくて導入したが、なかなかうまくいかず手こずった。その詳細を記す。

環境・バージョン

  • Windows 10 バージョン 21H1(OSビルド 19043.1645)
  • mitmproxy 8.0.0(ポータブル版
  • Google Chrome 100.0.4896.127(64 ビット)

ハマった手順

  1. Windowsでローカルプロキシサーバを指定する
    • Windowsの手動プロキシセットアップで「プロキシサーバを使う」をオンにする
    • アドレスは「192.168.10.9」、ポートは「7070」
    • アドレスはコマンドプロンプトかPowerShellで「ipconfig」を実施して、IPv4アドレスに記載されているローカルIPアドレス
  2. mitmproxyのプロキシサーバを起動する
    • mitmproxy.exeの場合、ショートカットを作って、リンク先の箇所に「–listen-port 7070」を追加して、ダブルクリックする
    • mitmweb.exeの場合、ショートカットを作って、リンク先の箇所に「–listen-port 7070 –web-port 7071」を追加して、ダブルクリックする
    • ポートのデフォルト値はlisten-port:8080、web-port:8081である。このままで良い場合はそのままダブルクリックで良い(この場合、手順1で設定するポート番号は「8080」)
    • web-port:7071の場合のアクセス先はここ
  3. 証明書をインポートする
    • 「mitmproxy-ca-cert.p12」をダウンロードしてダブルクリックする。途中、証明書をすべて次のストアに配置するで証明書ストアを「信頼されたルート証明機関」を選ぶ →自分の環境だとうまくいかなかった

上記がWindowsでmitmproxyを利用する手順である。

1か2が正しい状態でない場合、ここにアクセスしたときに「If you can see this, traffic is not passing through mitmproxy.」と表示される。

1と2が正しい状態の場合、ここにアクセスすると「Install mitmproxy’s Certificate Authority」と表示され、証明書のダウンロードができて各環境への証明書インポート方法を見れる。

1と2が正しい状態で3が正しくない状態だと、例えばChromeでYahooにアクセスすると「この接続ではプライバシーが保護されません」と表示される(他ブラウザでも同様の表示となる)。

今回ハマったのは、1~3が正しい状態のはずなのに「この接続ではプライバシーが保護されません」となってしまったところ。結果的に1と2は正しい状態で、3は正しい状態ではなかったことがわかった。

ハマりポイント詳細

「この接続ではプライバシーが保護されません」というエラー表示は具体的にこんな感じ。エラーコードは「NET::ERR_CERT_AUTHORITY_INVALID」。

mitmproxy画面上(mitmproxy.exe)では上記のような感じになる。「Warn: ローカルIPアドレス:ポート番号: Client TLS handshake failed. The client does not trust the proxy’s certificate for サーバ名~」というエラーが下部に出る。

公式の手順に沿って証明書をインポートしたのに証明書が効いてない。

何故これで解決できるか不明だが、chrome://settings/securityの下部にある「証明書の管理」からのインポートからならいけた。しかも、mitmproxy-ca-cert.cerは「中間証明機関」に、mitmproxy-ca-cert.p12は「信頼されたルート証明機関」にインポートする。

mitmproxy-ca-cert.cerはここから、mitmproxy-ca-cert.p12はここからダウンロードできる。どちらも、mitmproxyのプロキシサーバをローカルにたててからでないとアクセスできないので注意。もしくは、ポータブル版のmitmproxyを起動すると「%USERPROFILE%.mitmproxy」フォルダが作成され各証明書が入っているはずなのでそこから取得でもOK。

このようにしたら「この接続ではプライバシーが保護されません」のエラー表示がなくなった。

その他

ポート番号を変更したのは、他プログラムとの重複があったため。当初はポート番号変更なしで利用しようとしていたが、mitmweb.exeを起動したところ「[Errno 10048] error while attempting to bind on address (‘::’, 8080, 0, 0): 通常、各ソケットアドレスに対してプロトコル、ネットワークアドレス、またはポートのどれか1つのみを使用できます。」というエラーが出たため、ポート番号を変更した。

ポータブル版があったからいいものの、本当はmitmproxyはDockerを使ってやりたかったがうまくいかなかった。。

手順1と2は正しい状態で3が正しい状態でないときに、Firefoxで設定→プライバシーとセキュリティ→セキュリティ→証明書→証明書を表示で表示される証明書マネージャーでこれをインポートすることでできた。Firefoxからのアクセスだけ解析したいのであればこれでも良い。

iPhoneへの証明書インポートもやや通常と異なった。最初はmitmproxy-ca-cert.cerをインストール、その後にmitmproxy-ca-cert.pemをインストールしてうまくいった。mitmproxy-ca-cert.cerをインストールした状態だと通信は解析できるものの、非常に応答速度が遅くなった。その後のmitmproxy-ca-cert.pemは上書きインポートだと思うので最初からこれをインポートすればいいじゃんと思うが、何故かそれではうまくいかなった。

参考サイト

タイトルとURLをコピーしました