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.
を受け取ります。
言うまでもなく、Settings -> Security -> Install from storage
からpfx
証明書をインストールしました。証明書はUser Credentials
に表示されますが、Trusted credentials -> User
には表示されません。 Lollipopデバイスでは、証明書がそこにリストされています。
HTTPライブラリとしてokhttp3を使用しています。
私が間違っていることは何ですか?
OPのコメントのトラブルシューティングスレッドに基づいて、答えは、その証明書と秘密キーではなく、プロキシのCA証明書のみを信頼できるものとしてインストールすることです。
この問題は、次の2つの要因により発生しました。
MiTMプロキシのCA証明書だけでなく、プライベートキーもインストールします(デバイス上のVPNアプリが他のアプリからのMiTMネットワークトラフィックを復号化できるようにします)。デバイスにMiTMプロキシの秘密キーは必要ありません。
Android Nougatでは、証明書に加えて秘密キーを含むファイルのSettings -> Security -> Install from storage
フローの動作が変更されました。この動作の変更により、上記の問題が明らかになりました。
Nougatより前は、証明書に加えて秘密鍵を含むファイルのSettings -> Security -> Install from storage
フローは、クライアント証明書として使用されるように正しくインストールされることに加えて、サーバー認証(HTTPS、TLSなど、MiTMを成功させる)として信頼できる証明書を誤ってインストールしましたこのAndroidデバイスをサーバーに対して認証するため。 Nougatでは、バグが修正され、これらの証明書はサーバー認証で信頼済みとしてインストールされなくなりました。これにより、クライアント認証資格情報がサーバーへの接続のセキュリティに影響(弱体化)するのを防ぎます。シナリオでは、これによりMiTMが成功しなくなります。
問題を複雑にしているのは、Settings -> Security -> Install from storage
が、クライアント認証資格情報(秘密鍵+証明書チェーン)またはサーバー認証信頼アンカー(CA証明書だけをインストールするか、秘密鍵は不要か)をユーザーが明示的に指定する方法を提供しないことです)。その結果、Settings -> Security -> Install from storage
フローは、秘密鍵が指定されている場合、それがクライアント/ユーザー認証資格情報でなければならないことを前提として、クライアント/ユーザー認証資格情報またはサーバー認証信頼アンカーを処理しているかどうかを推測します。あなたの場合、サーバー認証のトラストアンカーではなく、クライアント/ユーザー認証の資格情報をインストールしていると誤って想定していました。
P. S. Network Security Configに関しては、おそらくデバッグモードで "システム"トラストアンカーも信頼するようにアプリを構成する必要があります(debug-overridesセクション)。そうしないと、CA証明書がAndroidデバイスに信頼済みとしてインストールされているプロキシによって接続がMiTMされない限り、アプリのデバッグビルドは機能しません。
解決策は、。p12を使用せず、Chrome(wifiで設定されたプロキシを使用)で http ://charlesproxy.com/getssl andinstall download .pem file.
Android 7.0を実行しているNexus 5Xでもまったく同じ問題が発生しました。以前にCharles 3.11.5から.p12がエクスポートされていました([ヘルプ]-> [SSLプロキシ]-> [Charlesルート証明書と秘密キーのエクスポート])。電話から.p12をインストールしようとすると([設定]-> [セキュリティ]-> [ストレージからインストール])、[ユーザー資格情報]にのみ表示され、[信頼できる資格情報]には表示されません。
Android 7.0の「ハウツー」の合計は次のようになります:
Android:networkSecurityConfig="@xml/network_security_config"
を<application>
に入れますPSデバイスの日付/時刻を確認してください。正しいはずです。
必要な例外をapkに挿入し、アプリでCharles Proxyを使用できるようにするスクリプトを作成しました。
これはGithubです https://github.com/levyitay/AddSecurityExceptionAndroid
私はAndroid 7.1.1を使用していますが、マニフェストを変更せずにデバイス(OnePlus One)で設定する方法は次のとおりです(アプリのAPI 21をターゲットにしていました)。
Charles Proxyの場合:
Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser
。この手順により、プロキシIPとポート番号、およびcharlesプロキシSSLをダウンロードする場所へのリンクが得られます。電話で:
Wifi Settings > Modify Network > Advanced Options
。 ProxyをManual
に設定し、Charlesから受け取ったIPとポート番号をそれぞれProxy hostname
とProxy port
に入力します。
(オプション)Charlesが以前に提供した chls.pro/ssl リンクにアクセスできる場合とできない場合があります。デバイスでは、ネットワーク接続がないことが常に通知されました。 charlesproxy.comをBypass proxy for
フィールドに追加しました。
ブラウザーで、ステップ3のリンクに移動し、必要な証明書をダウンロードします(Chromeで機能しない場合は、Dolphin Browserをダウンロードします)。証明書には任意の名前を付けることができます。
チャールズプロキシに戻る:
Allow
またはDeny
のいずれかのプロンプトを取得する必要があります。Nougat 7.1.1でCharlesを使用できるようになりました。