[解決済み] Android 7 nougatでCharlesのプロキシを動作させる方法?
質問
Android 7 では、証明書の処理方法にいくつかの変更が加えられました ( http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html ) が導入され、どういうわけか私の Charles プロキシを動作させることができなくなりました。
私の network_security_config.xml です。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config>
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
<debug-overrides>
<trust-anchors>
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>
デバッグモードで動かしています。しかし、何をやっても、私は
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
.
言うまでもないことですが、私がインストールしたのは
pfx
から証明書をインストールしました。
Settings -> Security -> Install from storage
. 証明書は
User Credentials
に表示されますが
Trusted credentials -> User
. 私のロリポップデバイスでは、証明書はそこにリストされています。
HTTPライブラリとしてokhttp3を使っています。
何が間違っているのでしょうか?
どのように解決するのですか?
OPのコメントのトラブルシューティングスレッドに基づいて、答えは、プロキシの証明書と秘密鍵ではなく、信頼できるものとしてプロキシのCA証明書だけをインストールすることである。
この問題は、2 つの要因によって引き起こされました。
-
MiTM プロキシの CA 証明書だけでなく、その秘密鍵もインストールすること (従って、デバイス上の VPN アプリが他のアプリからのネットワーク トラフィックを復号化/MiTM できるようにすること)。デバイス上に MiTM プロキシの秘密鍵は必要ありません。
-
Android Nougat による動作の変更で
Settings -> Security -> Install from storage
フローで、証明書に加えて秘密鍵が含まれるファイルに対する動作を変更しました。この動作の変更により、上記の問題が明らかになりました。
Nougat よりも前のバージョンでは
Settings -> Security -> Install from storage
フローで、証明書に加えて秘密鍵を含むファイルの証明書が、この Android デバイスをサーバーに認証するために使用されるクライアント証明書として正しくインストールされるだけでなく、サーバー認証 (たとえば、HTTPS、TLS、したがって MiTM が成功する) のために信頼されるものとして誤ってインストールされました。Nougatでは、このバグが修正され、これらの証明書は、サーバー認証のための信頼できる証明書としてインストールされなくなりました。これにより、クライアント認証の証明書がサーバーへの接続のセキュリティに影響を与える(弱める)ことができなくなりました。あなたのシナリオでは、これによって MiTM が成功するのを防いでいます。
問題を複雑にしているのは
Settings -> Security -> Install from storage
がクライアント認証のクレデンシャル (秘密鍵 + 証明書チェーン) とサーバー認証のトラストアンカー (単なる CA 証明書 -- 秘密鍵は不要) のどちらをインストールするかをユーザが明示的に指定する方法を提供しないことです。その結果
Settings -> Security -> Install from storage
フローは、秘密鍵が指定された場合、それがクライアント/ユーザー認証クレデンシャルでなければならないと仮定することによって、クライアント/ユーザー認証クレデンシャルまたはサーバー認証トラストアンカーのどちらを扱っているのかを推測します。このケースでは、サーバー認証トラスト アンカーではなく、クライアント/ユーザー認証クレデンシャルをインストールしていると誤って仮定しています。
P. 追記: ネットワーク セキュリティ設定に関して、デバッグ モード (debug-overrides セクション) で "system" トラスト アンカーも信頼するようにアプリを構成する必要があると思われます。そうでない場合、アプリのデバッグ ビルドは、CA 証明書が Android デバイスで信頼済みとしてインストールされているプロキシによって接続が MiTM されない限り、動作しません。
関連
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] AndroidのListViewで画像を遅延ロードする方法
-
[解決済み] Androidで画面の大きさをピクセル単位で取得する方法
-
[解決済み] Androidアプリケーションのアクティビティ間でデータを受け渡すにはどうすればよいですか?
-
[解決済み] Androidで現在の時刻と日付を取得する方法
-
[解決済み] Androidで'Context'を取得する静的な方法?
-
[解決済み] Androidの連絡先リストを呼び出すには?
-
[解決済み] TextView.setTextSizeの挙動がおかしい - テキストビューのテキストサイズを画面ごとに動的に設定する方法
-
[解決済み] FABアイコンの色を設定する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] SDカードからファイルを削除する方法を教えてください。
-
[解決済み] RecyclerView.Stateを使って、RecyclerViewのスクロール位置を保存するには?
-
[解決済み] android: imageview の画像を画面に合わせて伸縮させる
-
[解決済み] Nexus 4でUSBデバッグモードを見つける方法とオンにする方法
-
[解決済み] バイト配列の画像ファイルをビットマップに変換するには?
-
[解決済み] Studio 3.4 をアップデートしたら、引数の leftShift() メソッドが見つかりませんでした。
-
[解決済み] Android StudioからADBを手動で再起動する方法
-
[解決済み] キャンバスに複数行のテキストを描画する
-
[解決済み] グリッドビューの高さが削減される
-
[解決済み] Androidでツールバーの戻るボタンの色を変えるには?