Wie bekomme ich Charles Proxy mit Android 7 Nougat?

101

Android 7 hat einige Änderungen an der Art und Weise vorgenommen, wie Zertifikate behandelt werden ( http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html ), und irgendwie kann ich meinen Charles-Proxy nicht mehr zum Laufen bringen.

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 laufe im Debug-Modus. Aber egal was, ich verstehe javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found..

Unnötig zu erwähnen, dass ich ein pfxZertifikat von installiert habe Settings -> Security -> Install from storage. Das Zertifikat wird in User Credentialsaber nicht in angezeigt Trusted credentials -> User. Auf meinem Lollipop-Gerät sind die Zertifikate dort aufgelistet.

Ich verwende okhttp3 als HTTP-Bibliothek.

Irgendeine Idee, was ich falsch mache?

mbonnin
quelle
1
Als Schnelltest, versuchen Sie das Hinzufügen / Bewegen des usereinen in das <base-config>und wenn das Änderungen Angelegenheiten sehen. Es sollte nicht, aber es wird nur einen Moment dauern, um es zu versuchen.
CommonsWare
Müssen Sie nicht die explizite Zertifizierungsstelle für Charles in developer.android.com/training/articles/security-config.html hinzufügen : 'Trusting Additional CAs', da die Charles-Zertifizierungsstelle eine selbst generierte CA ist und sich nicht in der befindet Android System Vertrauenskette?
Morrison Chang
@Morisson Chang: Ich möchte die Charles CA nicht in die App einbetten, sondern sie manuell auf meinem Entwicklungstelefon hinzufügen können, wie ich es früher getan habe. VonSettings -> Security -> Install from storage
mbonnin
1. Wie verweisen Sie auf die Datei network_security_config.xml in der AndroidManifest.xml Ihrer App? 2. Würden Sie bitte die PFX-Datei verlinken? Ich gehe davon aus, dass es nur das CA-Zertifikat enthält (keine privaten Schlüssel) und daher in Ordnung zu veröffentlichen sein sollte. Ich frage, weil, wenn die .pfx einen privaten Schlüssel enthält, angenommen wird, dass es sich um eine Client-Zertifizierungsdatei handelt und daher die Zertifizierungsstelle aus der Datei nicht als vertrauenswürdig für die Serverauthentifizierung installiert wird.
Alex Klyubin
1
@AlexKlyubin Hurra, es funktioniert jetzt :). Ich musste wohl meine Charles oder App oder was auch immer neu starten. Ich war verwirrt, weil ich die gleiche PFX-Datei vor Nougat auf unzähligen Android-Geräten installiert habe und sie als in Ordnung erkannt wurden. Aber jetzt ist alles gut. Könnten Sie eine Antwort schreiben, damit ich sie genehmigen kann?
mbonnin

Antworten:

26

Basierend auf dem Kommentar-Thread zur Fehlerbehebung für das OP besteht die Antwort darin, nur das CA-Zertifikat des Proxys als vertrauenswürdig zu installieren, nicht dessen Zertifikat + privater Schlüssel.

Das Problem wurde durch zwei Faktoren verursacht:

  1. Installieren nicht nur des CA-Zertifikats des MiTM-Proxys, sondern auch seines privaten Schlüssels (wodurch VPN-Apps auf dem Gerät den MiTM-Netzwerkverkehr von anderen Apps entschlüsseln können). Sie benötigen den privaten Schlüssel des MiTM-Proxys nicht auf dem Gerät.

  2. Android Nougat Änderung des Settings -> Security -> Install from storageAblaufverhaltens für Dateien, die neben Zertifikaten auch einen privaten Schlüssel enthalten. Diese Verhaltensänderung entlarvte das obige Problem.

Vor Nougat hat der Settings -> Security -> Install from storageDatenfluss für Dateien, die zusätzlich zu den Zertifikaten einen privaten Schlüssel enthalten, die Zertifikate fälschlicherweise als vertrauenswürdig für die Serverauthentifizierung installiert (z. B. HTTPS, TLS, wodurch Ihr MiTM erfolgreich ist) und zusätzlich korrekt als Client-Zertifikate installiert 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 Anmeldeinformationen für die Clientauthentifizierung die Sicherheit von Verbindungen zu Servern beeinträchtigen (schwächen). In Ihrem Szenario verhindert dies, dass Ihr MiTM erfolgreich ist.

Erschwerend kommt hinzu, dass der Settings -> Security -> Install from storageBenutzer nicht explizit angeben kann, ob er einen Clientauthentifizierungsnachweis (privater Schlüssel + Zertifikatskette) oder einen Vertrauensanker für die Serverauthentifizierung installiert (nur ein CA-Zertifikat - kein privater Schlüssel erforderlich). . Infolgedessen Settings -> Security -> Install from storageerrät der Ablauf, ob es sich um einen Client / Benutzer-Authentifizierungsnachweis oder einen Serverauthentifizierungs-Vertrauensanker handelt, indem angenommen wird, dass es sich bei Angabe eines privaten Schlüssels um einen Client / Benutzer-Authentifizierungsnachweis handeln muss. In Ihrem Fall wurde fälschlicherweise davon ausgegangen, dass Sie einen Client- / Benutzerauthentifizierungsnachweis anstelle eines Vertrauensankers für die Serverauthentifizierung installieren.

PS In Bezug auf Ihre Netzwerksicherheitskonfiguration 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 die Verbindungen von einem Proxy über MiTM hergestellt werden, dessen CA-Zertifikat auf dem Android-Gerät als vertrauenswürdig installiert ist.

Alex Klyubin
quelle
1
Zum PS: In der Dokumentation steht Trust anchors specified in debug-overrides are added to all other configurations. Ich hatte also den Eindruck, dass es zu 'base-config' hinzugefügt und nicht vollständig ersetzt wurde?
mbonnin
Oh, du hast Recht. Sie müssen "System" -Vertrauensanker in Debug-Überschreibungen nicht explizit auflisten.
Alex Klyubin
4
Diese Antwort ist unklar. Bitte beziehen Sie sich auf die Antwort von @ stkent unten.
Adam Hurwitz
4
Stimmen Sie zu, diese Antwort erklärt, was passiert, ist aber sehr unklar, welche Schritte man tun sollte.
StarWind0
114

Die Lösung besteht darin , keine .p12-Datei zu verwenden . Navigieren Sie einfach mit Chrome (mit konfiguriertem Proxy über WLAN) zu http://charlesproxy.com/getssl und installieren Sie die heruntergeladene .pem-Datei .

Ich hatte genau das gleiche Problem auf meinem Nexus 5X mit Android 7.0. Es wurde zuvor .p12 aus Charles 3.11.5 exportiert (Hilfe-> SSL-Proxy-> Charles-Stammzertifikat und privaten Schlüssel exportieren). Als ich versuchte, .p12 vom Telefon aus zu installieren (Einstellungen-> Sicherheit-> Vom Speicher installieren), wird es nur unter "Benutzeranmeldeinformationen" und niemals unter "Vertrauenswürdige Anmeldeinformationen" angezeigt, und natürlich funktionierte SSL mit Charles-Proxy nicht.

Das gesamte "How-to" für Android 7.0 wäre wie folgt:

  1. Konfigurieren Sie WiFi + Proxy (wie Charles es benötigt). Schließen Sie es an.
  2. Navigieren Sie auf dem Gerät mit Chrome zu http://charlesproxy.com/getssl , akzeptieren Sie die Anforderung zum Herunterladen von .pem und drücken Sie "Öffnen". Daraufhin wird die App "Certificate Installer" gestartet. Verwenden Sie diese Option, um das Zertifikat als "VPN und Apps" zu installieren.
  3. Fügen Sie das Attribut android:networkSecurityConfig="@xml/network_security_config"in <application>Manifest.xml ein
  4. Erstellen Sie res / xml / network_security_config.xml mit dem Inhalt des ersten Beitrags (es ist völlig korrekt).
  5. Starten Sie Charles und App und haben Sie Spaß.

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

Alexander Skvortsov
quelle
2
Ein wichtiger Hinweis zu dieser großartigen Antwort: Wenn Ihre App auf API 23 oder niedriger abzielt, benötigen Sie die Schritte 3 und 4 nicht. Tatsächlich können Sie das Netzwerk-Sicherheits-Konfigurationsmaterial nicht kompilieren, wenn Sie über API 23 verfügen oder niedriger.
David Ferrand
1
Dies ist eine großartige Lösung für Android 7.0. Viel klarer als die offiziellen Informationen von Charles Proxy.
Adam Link
3
Wahrscheinlich nur ich, aber diese Schritte funktionieren in 7.1.1 nicht mehr für mich. Ich habe vor kurzem ein Update gemacht
Satyajit
@satyajit Diese Lösung funktioniert für mich unter Android 7.1.1 auf einem Google Pixel.
Dick Lucas
mit oder ohne Schritte 3 und 4?
Satyajit
-1

Ich arbeite mit Android 7.1.1. So richte ich auf meinem Gerät (OnePlus One) ein - ohne Ä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. In diesem Schritt erhalten Sie die Proxy-IP und die Portnummer sowie den Link, über den Sie das Proxy-SSL von charles herunterladen sollten.

Auf Ihrem Telefon:

  1. Wifi Settings > Modify Network > Advanced Options. Set - Proxy Manualund geben Sie die IP und Port Nummer , die Sie von Charles in empfangene Proxy hostnameund Proxy portjeweils.

  2. (OPTIONAL) Möglicherweise können Sie auf den zuvor von Charles bereitgestellten Link chls.pro/ssl zugreifen oder nicht . Auf meinem Gerät wurde ich immer benachrichtigt, dass ich keine Netzwerkverbindung hatte. Ich habe charlesproxy.com zum Bypass proxy forFeld hinzugefügt .

  3. Gehen Sie in Ihrem Browser zu dem Link in Schritt 3 und laden Sie das erforderliche Zertifikat herunter (wenn es in Chrome nicht funktioniert, laden Sie den Dolphin Browser herunter). Sie können Ihr Zertifikat mit einem beliebigen Namen benennen.

Zurück zu Charles Proxy:

  1. Sie sollten entweder Allowoder DenyIhr Telefon aufgefordert werden, den Proxy zu verwenden, wenn Ihre Einstellungen standardmäßig so sind, dass Sie zur Eingabe von Remoteverbindungen aufgefordert werden.

Sie können jetzt Charles auf Nougat 7.1.1 verwenden.

Cheruby
quelle