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


101

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

私が間違っていることは何か考えていますか?


1
簡単なテストとして、user1つをに追加/移動してみて<base-config>、変更が重要かどうかを確認してください。すべきではありませんが、試すのに少し時間がかかります。
CommonsWare 2016

Charlesの明示的なCAをdeveloper.android.com/training/articles/security-config.htmlに追加する必要はありませんか?Charles CAは自己生成されたものであり、 Androidシステムの信頼チェーン?
Morrison Chang

@モリソン・チャン:Charles CAをアプリに埋め込みたくありません。以前と同じように、開発用電話に手動で追加できるようにしたいです。FromSettings -> Security -> Install from storage
mbonnin

1.アプリのAndroidManifest.xmlでnetwork_security_config.xmlをどのように参照していますか?2. .pfxファイルをリンクしますか?私はそれがCA証明書のみ(秘密鍵なし)を含んでいると想定しているため、公開しても問題ありません。.pfxに秘密キーが含まれている場合、それはクライアント証明書ファイルであると見なされ、ファイルからのCAはサーバー認証用に信頼できるものとしてインストールされないので、私は尋ねています。
Alex Klyubin 16

1
@AlexKlyubin hurra、現在機能しています:) チャールズやアプリなどを再起動する必要があったと思います。nougatの前に無数のAndroidデバイスに同じ.pfxファイルをインストールしていて、問題なく認識されたため、混乱しました。しかし、今はすべてが良好です。回答を書いていただけませんか。
mbonnin 2016

回答:


26

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

この問題の原因は2つあります。

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

  2. Android Nougatは、Settings -> Security -> Install from storage証明書に加えて秘密鍵を含むファイルのフローの動作を変更します。この動作の変更により、上記の問題が明らかになりました。

ヌガー以前は、 Settings -> Security -> Install from storage、証明書に加えて秘密鍵を含むファイルフローは、サーバー認証(HTTPS、TLSなど)として信頼できるものとして誤って証明書をインストールし、クライアント証明書として正しくインストールされていることに加えて、このAndroidデバイスをサーバーに対して認証します。Nougatでは、バグが修正され、これらの証明書はサーバー認証用に信頼できるものとしてインストールされなくなりました。これにより、クライアント認証資格情報がサーバーへの接続のセキュリティに影響を与える(弱める)のを防ぎます。シナリオでは、これによりMiTMが成功しなくなります。

問題を複雑にするのは、Settings -> Security -> Install from storageが、ユーザーがクライアント認証資格情報(秘密鍵+証明書チェーン)またはサーバー認証トラストアンカー(CA証明書のみ-秘密鍵は不要)をインストールするかどうかを指定する明示的な方法を提供しないことです。 。その結果、Settings -> Security -> Install from storageフローは、秘密鍵が指定されている場合、クライアント/ユーザー認証資格情報でなければならないことを想定して、クライアント/ユーザー認証資格情報またはサーバー認証トラストアンカーのどちらを処理するかを推測します。あなたのケースでは、サーバー認証トラストアンカーではなくクライアント/ユーザー認証資格情報をインストールしていると誤って想定していました。

PS Network Security Configに関しては、おそらくデバッグモードで「システム」トラストアンカーも信頼するようにアプリを構成する必要があります(debug-overridesセクション)。それ以外の場合、接続がCA証明書がAndroidデバイスに信頼できるものとしてインストールされているプロキシによってMiTMされない限り、アプリのデバッグビルドは機能しません。


1
PSについて:ドキュメントは述べていますTrust anchors specified in debug-overrides are added to all other configurations。だから私はそれが「base-config」に追加され、完全に置き換えられていないという印象を受けましたか?
mbonnin

ああ、あなたは正しい。デバッグオーバーライドで「システム」トラストアンカーを明示的にリストする必要はありません。
Alex Klyubin 16

4
この答えは不明確です。以下の@stkentの回答を参照してください。
Adam Hurwitz

4
この回答が何が起こっているのかを説明することに同意しますが、人が何をすべきかは非常に不明確です。
StarWind0

114

解決策は.p12を使用せず、Chrome(wifiでプロキシを設定)でhttp://charlesproxy.com/getsslに移動しダウンロードした.pemファイルインストールするだけです

Android 7.0を実行しているNexus 5Xでもまったく同じ問題が発生しました。Charles 3.11.5から以前に.p12がエクスポートされていました(ヘルプ-> SSLプロキシ-> Charlesのルート証明書と秘密鍵のエクスポート)。電話から.p12をインストールしようとしたとき([設定]-> [セキュリティ]-> [ストレージからインストール])、「ユーザー資格情報」の下にのみ表示され、「信頼できる資格情報」には表示されません。もちろん、チャールズプロキシでのSSLは機能しませんでした。

Android 7.0の「ハウツー」の合計は次のようになります。

  1. WiFi +プロキシを構成します(Charlesがそれをどのように要求するか)。接続してください。
  2. デバイスで、Chromeを使用してhttp://charlesproxy.com/getsslに移動し、ダウンロードの要求.pemを受け入れて、「開く」を押すと、「証明書インストーラー」アプリが起動します。証明書を「VPNとアプリ」としてインストールするために使用します。
  3. 属性android:networkSecurityConfig="@xml/network_security_config"<application>Manifest.xmlに配置します
  4. 最初の投稿の内容でres / xml / network_security_config.xmlを作成します(完全に正しいです)。
  5. Charlesとアプリを起動して、楽しんでください。

PSデバイスの日付と時刻を確認します。正しいはずです。


2
この素晴らしい答えに関する重要な注意:アプリがAPI 23以下をターゲットにしている場合、ステップ3と4は必要ありません。実際、API 23がある場合、network-security-configのものをコンパイルすることはできません。以下。
デビッドフェランド

1
これはAndroid 7.0の優れたソリューションです。公式のCharles Proxy情報よりもはるかに明確です。
アダムリンク

3
おそらく私だけですが、これらの手順は7.1.1ではもう機能しません。最近更新しました
satyajit 2017

@satyajitこのソリューションは、Google PixelのAndroid 7.1.1で動作します。
ディックルーカス

ステップ3と4の有無は?
satyajit 2017

-1

私は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とポート番号、およびチャールズプロキシSSLをダウンロードする必要がある場所へのリンクが提供されます。

スマートフォンで:

  1. Wifi Settings > Modify Network > Advanced Options。設定プロキシへManualとあなたにチャールズから受信したIPアドレスとポート番号入力Proxy hostnameし、Proxy portそれぞれを。

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

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

Charles Proxyに戻ります。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.