it-swarm.com.de

Wie bekomme ich Charles Proxy mit Android 7 Nougat?

In Android 7 wurden einige Änderungen an der Art und Weise vorgenommen, wie Zertifikate gehandhabt werden ( http://Android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html ) und irgendwie kann ich meinen Charles-Proxy nicht erstellen Arbeit mehr.

Meine 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>

Ich arbeite im Debug-Modus. Aber egal was ich bekomme javax.net.ssl.SSLHandshakeException: Java.security.cert.CertPathValidatorException: Trust anchor for certification path not found..

Natürlich habe ich ein pfx-Zertifikat von Settings -> Security -> Install from storage installiert. Das Zertifikat wird in User Credentials angezeigt, jedoch nicht in Trusted credentials -> User. Auf meinem Lollipop-Gerät werden die Zertifikate dort aufgelistet. 

Ich benutze okhttp3 als HTTP-Bibliothek.

Irgendeine Idee, was ich falsch mache?

85
mbonnin

Basierend auf dem Fehlerbehebungs-Thread von Kommentaren für das OP besteht die Antwort darin, nur das CA-Zertifikat des Proxys als vertrauenswürdig zu installieren, nicht dessen Zertifizierungsschlüssel + privaten Schlüssel.

Das Problem wurde durch zwei Faktoren verursacht:

  1. Installieren Sie nicht nur das CA-Zertifikat des MiTM-Proxys, sondern auch den privaten Schlüssel (damit VPN-Apps auf dem Gerät entschlüsselt werden können/MiTM-Netzwerkverkehr von anderen Apps). Sie benötigen den privaten Schlüssel des MiTM-Proxys nicht auf dem Gerät.

  2. Android Nougat Verhaltensänderung des Settings -> Security -> Install from storage-Flusses für Dateien, die zusätzlich zu den Zertifikaten einen privaten Schlüssel enthalten. Diese Verhaltensänderung hat das obige Problem demaskiert.

Vor Nougat hat der Settings -> Security -> Install from storage-Fluss für Dateien, die einen privaten Schlüssel enthalten, zusätzlich zu Zertifikaten die Zertifikate fälschlicherweise als vertrauenswürdig für die Serverauthentifizierung (z. B. HTTPS, TLS, damit Ihr MiTM erfolgreich ist) installiert und als Client-Zertifikate ordnungsgemäß installiert zur Authentifizierung dieses Android-Geräts bei Servern. In Nougat wurde der Fehler behoben und diese Zertifikate werden nicht mehr als vertrauenswürdig für die Serverauthentifizierung installiert. Dadurch wird verhindert, dass die Anmeldeinformationen der Clientauthentifizierung die Sicherheit von Verbindungen zu Servern beeinflussen (schwächen). In Ihrem Szenario verhindert dies, dass Ihre MiTM erfolgreich ist.

Kompliziert ist, dass Settings -> Security -> Install from storage dem Benutzer keine explizite Möglichkeit bietet, anzugeben, ob er einen Clientauthentifizierungsnachweis (privater Schlüssel + Zertifizierungskette) oder einen Serverauthentifizierungs-Vertrauensanker installiert (nur ein CA-Zertifikat - kein privater Schlüssel erforderlich) ). Der Settings -> Security -> Install from storage-Fluss schätzt daher, ob es sich um die Client-/Benutzerauthentifizierungsanmeldeinformationen oder den Serverauthentifizierungs-Vertrauensanker handelt, und geht davon aus, dass es sich bei der Angabe eines privaten Schlüssels um eine Client-/Benutzerauthentifizierungsberechtigung handeln muss. In Ihrem Fall wurde fälschlicherweise davon ausgegangen, dass Sie einen Client-/Benutzerauthentifizierungsnachweis anstelle eines Serverauthentifizierungs-Vertrauensankers installieren.

P. S. In Bezug auf Network Security Config sollten Sie die App wahrscheinlich so konfigurieren, dass sie auch "System" -Vertrauensankern im Debug-Modus vertraut (Abschnitt "Debug-Overrides"). Andernfalls funktionieren Debug-Builds der App nur, wenn Verbindungen von einem Proxy, dessen CA-Zertifikat als vertrauenswürdig auf dem Android-Gerät installiert ist, MiTM-Verbindungen sind.

23
Alex Klyubin

Die Lösung lautet Verwenden Sie .p12 nicht, navigieren Sie einfach mit Chrome (mit konfiguriertem Proxy auf WLAN) zu http://charlesproxy.com/getssl und heruntergeladene .pem-Datei.

Ich hatte genau das gleiche Problem auf meinem Nexus 5X mit Android 7.0 . Vorher wurde .p12 aus Charles 3.11.5 exportiert (Hilfe-> SSL-Proxying-> Exportieren des Charles-Root-Zertifikats und des privaten Schlüssels). Wenn ich versuchte, .p12 vom Telefon aus zu installieren (Einstellungen-> Sicherheit-> Vom Speicher installieren), wird es nur unter "Benutzeranmeldeinformationen" und nie unter "Vertrauenswürdige Anmeldeinformationen" angezeigt. SSL mit Charles-Proxy funktionierte natürlich nicht.

Das Gesamt-How-To für Android 7.0 wäre so:

  1. Konfigurieren Sie WiFi + Proxy (wie Charles es erfordert). Verbinden Sie es.
  2. Navigieren Sie auf dem Gerät mit Chrome zu http://charlesproxy.com/getssl , akzeptieren Sie die Anforderung zum Herunterladen .pem, drücken Sie dann die Taste "Öffnen" und starten Sie die App "Certificate installer". Verwenden Sie es, um das Zertifikat als "VPN und Apps" zu installieren. 
  3. Setzen Sie das Attribut Android:networkSecurityConfig="@xml/network_security_config" in <application> in Manifest.xml
  4. Erstellen Sie res/xml/network_security_config.xml mit Inhalt aus dem ersten Beitrag (es ist absolut korrekt).
  5. Starten Sie Charles und App und haben Sie Spaß. 

P.S. Überprüfen Sie Datum und Uhrzeit auf dem Gerät. Es sollte richtig sein.

99

Ich habe ein Skript geschrieben, das die apk mit den erforderlichen Ausnahmen injiziert und die Verwendung von Charles Proxy mit der App zulässt.

Dies ist der Github https://github.com/levyitay/AddSecurityExceptionAndroid

26
Itay Levy

Ich arbeite auf Android 7.1.1. So wird das Setup auf meinem Gerät (OnePlus One) vorgenommen - ohne die Änderung des Manifests (ich habe API 21 für meine App ausgewählt):

In Charles Proxy:

  1. Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser. Diese Schritte geben Ihnen die Proxy-IP und -Port-Nummer sowie den Link zu der Stelle, an der Sie charles Proxy SSL herunterladen sollten.

Auf deinem Handy:

  1. Wifi Settings > Modify Network > Advanced Options. Stellen Sie Proxy auf Manual ein und geben Sie die IP- und Port-Nummer, die Sie von Charles erhalten haben, in Proxy hostname und Proxy port ein.

  2. (OPTIONAL) Möglicherweise können Sie nicht auf den Link chls.pro/ssl zugreifen, den Charles zuvor bereitgestellt hat. Auf meinem Gerät wurde mir immer mitgeteilt, dass ich keine Netzwerkverbindung habe. Ich habe charlesproxy.com zum Feld Bypass proxy for hinzugefügt. 

  3. Rufen Sie in Ihrem Browser den Link in Schritt 3 auf, und laden Sie das erforderliche Zertifikat herunter (wenn es nicht in Chrome funktioniert, laden Sie den Dolphin Browser herunter). Sie können Ihrem Zertifikat einen beliebigen Namen geben.

Zurück zu Charles Proxy:

  1. Sie sollten die Aufforderung erhalten, entweder Allow oder Deny für Ihr Telefon aufzurufen, um den Proxy zu verwenden, wenn Ihre Einstellungen standardmäßig auf Nach Remote-Verbindungen fragen gefragt werden.

Sie können Charles jetzt auf Nougat 7.1.1 verwenden.

0
Cheruby