web-dev-qa-db-ja.com

Android 7 nougatでチャールズプロキシを動作させる方法は?

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を使用しています。

私が間違っていることは何ですか?

89
mbonnin

OPのコメントのトラブルシューティングスレッドに基づいて、答えは、その証明書と秘密キーではなく、プロキシのCA証明書のみを信頼できるものとしてインストールすることです。

この問題は、次の2つの要因により発生しました。

  1. MiTMプロキシのCA証明書だけでなく、プライベートキーもインストールします(デバイス上のVPNアプリが他のアプリからのMiTMネットワークトラフィックを復号化できるようにします)。デバイスにMiTMプロキシの秘密キーは必要ありません。

  2. 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されない限り、アプリのデバッグビルドは機能しません。

24
Alex Klyubin

解決策は、。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の「ハウツー」の合計は次のようになります:

  1. WiFi +プロキシを設定します(Charlesが要求する方法)。接続してください。
  2. デバイスで、Chromeを使用して http://charlesproxy.com/getssl に移動し、.pemのダウンロード要求を受け入れてから[開く]を押すと、[証明書インストーラー]アプリが起動します。これを使用して、証明書を「VPNおよびアプリ」としてインストールします。
  3. Manifest.xmlで属性Android:networkSecurityConfig="@xml/network_security_config"<application>に入れます
  4. 最初の投稿のコンテンツを使用してres/xml/network_security_config.xmlを作成します(まったく正しいです)。
  5. Charlesとアプリを起動して、楽しんでください。

PSデバイスの日付/時刻を確認してください。正しいはずです。

104

必要な例外をapkに挿入し、アプリでCharles Proxyを使用できるようにするスクリプトを作成しました。

これはGithubです https://github.com/levyitay/AddSecurityExceptionAndroid

28
Itay Levy

私はAndroid 7.1.1を使用していますが、マニフェストを変更せずにデバイス(OnePlus One)で設定する方法は次のとおりです(アプリのAPI 21をターゲットにしていました)。

Charles Proxyの場合:

  1. Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser。この手順により、プロキシIPとポート番号、およびcharlesプロキシSSLをダウンロードする場所へのリンクが得られます。

電話で:

  1. Wifi Settings > Modify Network > Advanced Options。 ProxyをManualに設定し、Charlesから受け取ったIPとポート番号をそれぞれProxy hostnameProxy portに入力します。

  2. (オプション)Charlesが以前に提供した chls.pro/ssl リンクにアクセスできる場合とできない場合があります。デバイスでは、ネットワーク接続がないことが常に通知されました。 charlesproxy.comをBypass proxy forフィールドに追加しました。

  3. ブラウザーで、ステップ3のリンクに移動し、必要な証明書をダウンロードします(Chromeで機能しない場合は、Dolphin Browserをダウンロードします)。証明書には任意の名前を付けることができます。

チャールズプロキシに戻る:

  1. 設定がデフォルトでリモート接続を要求するように設定されている場合、プロキシを使用するには、AllowまたはDenyのいずれかのプロンプトを取得する必要があります。

Nougat 7.1.1でCharlesを使用できるようになりました。

0
Cheruby