1. ホーム
  2. android

[解決済み] Android 7 nougatでCharlesのプロキシを動作させる方法?

2022-12-18 04:04:06

質問

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 つの要因によって引き起こされました。

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

  2. 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 されない限り、動作しません。