
HTTPプロトコルやHTTPSプロトコルを介してさまざまなAndroidアプリケーションをやり取りしているのを見るのが楽しみです。 独自のソフトウェアを開発している場合でも、すべてのトラフィックをリアルタイムで確認すると便利な場合があります。 これらのタスクを実装するために、たとえばCharlesやFiddler2など、多くの優れたプログラムが長い間発明されてきました。 実際には、それらの多くがあります。上記の2つだけが、通常、HTTPだけでなくHTTPSも表示できます。
困難は、Androidデバイスと外部サーバー間のトラフィックを傍受することから始まります。 暗号化されていない(HTTPプロトコル)トラフィックの場合、すべてが非常に簡単です( 指示です )-Fiddler2外部接続を許可します。Androidでは、Fiddler2を使用してマシンのプロキシサーバーアドレスを設定します。 しかし、HTTPSトラフィックのインターセプトを設定するには、もう少し時間がかかりました。
理論
それで、難しさは何ですか? 実際、HTTPSプロトコルを使用する場合、クライアントはデフォルトで、接続先のサーバーが本当に必要かどうかをチェックします。 このために、証明書が使用されます。 そして今、実際のサーバーの場合、この証明書ももちろん実際のものであり、開いているURLに対応していますが、プロキシはそうではありません。 デスクトップオペレーティングシステムのこの問題を解決するために、そのような場合、Fiddler2で偽の証明書を生成し、信頼できる証明書にインポートすることができます。クライアントは、Fiddler2との接続が完全に安全であると常に信じます。 残念なことに、モバイルデバイスでは、私の耳にこのような簡単な気分はありませんでした。
まず、4.0未満のAndroidバージョンで外部証明書をインポートする可能性はありません。 根ざしたデバイスには信頼できないオプションがいくつかありますが、これは私たちのやり方ではありません。
第二に、Androidでは、バージョン4.0でもFiddler2証明書をインポートできません。 実際、デフォルトで生成された証明書は、そこにあるAndroidセキュリティ基準に対応せず、インストールされていません。 特別な方法で生成する必要があります。
第三に、プログラムが一斉に偽の証明書をすぐに信じるという事実すらありません。 ニュアンスがあります。
練習する
- Androidバージョン4.0以降を搭載したデバイスを使用します。 いいえ、2.3のデバイスは機能しません。 はい、エミュレータバージョン4.0で対応します。
- Fiddler2の最新バージョンをコンピューターにインストールします。
- ここから Android互換のセキュリティ証明書を生成するための特別なライブラリをインストールします 。
- Fiddler2からセキュリティ証明書をエクスポートします(「ツール-> Fiddlerオプション-> HTTPS->ルート証明書をデスクトップにエクスポート」)。 フラッシュドライブ、ルート(または、使用する場合はエミュレーター)に配置します。
- Androidでは、信頼できる証明書にセキュリティ証明書を追加します(「設定」>「セキュリティ」>「SDカードからインストール」)
- Fiddler2を起動し、設定で外部接続を許可します
。
- Androidでは、ネットワーク設定で、デスクトップマシンのアドレスをプロキシとしてFiddler2に登録します。
- Androidでは、ブラウザーを開いてgoogle.comと入力し、Fiddler2ウィンドウで回答を含むリクエストを確認します。

だから、ブラウザでそれが判明した。 残念ながら、すべてのプログラムがブラウザほど信頼されているわけではありません。 たとえば、 Apache HTTP Clientを使用している自分のソフトウェアでは、この方法は機能しませんでした-Apachevクライアントは信頼できるOS証明書に吐き出します。 この場合、次のようにこのチェックを手動で無効にする必要がありました。
Protocol.registerProtocol("https", new Protocol("https", new EasySSLProtocolSocketFactory(), 443));
EasySSLProtocolSocketFactoryは ここから取得され、すべての証明書への信頼を許可します。
デバッグのためだけに安全ではありません!
その後、私のプログラムのトラフィックもFiddler2に正常に表示されるようになりました。