Come far funzionare il proxy charles con Android 7 nougat?


101

Android 7 ha introdotto alcune modifiche al modo in cui vengono gestiti i certificati ( http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html ) e in qualche modo non riesco più a far funzionare il mio proxy Charles.

Il mio 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>

Sto eseguendo in modalità debug. Ma non importa cosa, ottengo javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found..

Inutile dire che ho installato un pfxcertificato da Settings -> Security -> Install from storage. Il certificato viene mostrato in User Credentialsma non in Trusted credentials -> User. Sul mio dispositivo lollipop, i certificati sono elencati lì.

Sto usando okhttp3 come libreria HTTP.

Qualche idea su cosa sto facendo di sbagliato?


1
Come test rapido, prova ad aggiungere / spostare userquello in <base-config>e vedi se cambia. Non dovrebbe, ma ci vorrà solo un momento per provare.
CommonsWare

Non avresti bisogno di aggiungere la CA esplicita per Charles in developer.android.com/training/articles/security-config.html : "Trusting Additional CAs" poiché la Charles CA è autogenerata e non sarebbe nel Catena di fiducia del sistema Android?
Morrison Chang

@ Morisson Chang: non voglio incorporare la Charles CA nell'app, voglio essere in grado di aggiungerla manualmente sul mio telefono di sviluppo come facevo una volta. DaSettings -> Security -> Install from storage
mbonnin

1. Come stai facendo riferimento a network_security_config.xml nel file AndroidManifest.xml della tua app? 2. Collegheresti il ​​file .pfx? Presumo che contenga solo il certificato CA (nessuna chiave privata) e quindi dovrebbe andare bene per la pubblicazione. Lo chiedo perché, se .pfx contiene una chiave privata, si presume che sia un file cert del client e quindi CA dal file non verrà installato come attendibile per l'autenticazione del server.
Alex Klyubin

1
@AlexKlyubin hurra, ora funziona :). Immagino di aver bisogno di riavviare il mio charles o l'app o qualsiasi altra cosa. Ero confuso perché ho installato lo stesso file .pfx su innumerevoli dispositivi Android prima di nougat e sono stati riconosciuti bene. Ma adesso va tutto bene. Potresti scrivere una risposta in modo che io possa approvarla?
mbonnin

Risposte:


26

In base al thread di risoluzione dei problemi dei commenti per l'OP, la risposta è installare solo il certificato CA del proxy come attendibile, non il suo certificato + chiave privata.

Il problema è stato causato da due fattori:

  1. Installazione non solo del certificato CA del proxy MiTM ma anche della sua chiave privata (consentendo così alle app VPN sul dispositivo di decrittografare / traffico di rete MiTM da altre app). Non è necessaria la chiave privata del proxy MiTM sul dispositivo.

  2. Android Nougat modifica il comportamento del Settings -> Security -> Install from storageflusso per i file che contengono una chiave privata oltre ai certificati. Questo cambiamento nel comportamento ha smascherato il problema precedente.

Prima di Nougat, il Settings -> Security -> Install from storageflusso per i file contenenti una chiave privata oltre ai certificati installava erroneamente i certificati come attendibili per l'autenticazione del server (ad esempio, HTTPS, TLS, facendo in modo che il tuo MiTM abbia successo), oltre ad essere correttamente installati come certificati client utilizzati per autenticare questo dispositivo Android sui server. In Nougat, il bug è stato corretto e questi certificati non sono più installati come attendibili per l'autenticazione del server. Ciò impedisce che le credenziali di autenticazione del client influiscano (indeboliscano) la sicurezza delle connessioni ai server. Nel tuo scenario, questo impedisce al tuo MiTM di avere successo.

Ciò che complica le cose è che Settings -> Security -> Install from storagenon fornisce all'utente un modo esplicito per specificare se sta installando una credenziale di autenticazione client (chiave privata + catena di certificati) o un ancoraggio di fiducia dell'autenticazione del server (solo un certificato CA - nessuna chiave privata necessaria) . Di conseguenza, il Settings -> Security -> Install from storageflusso indovina se si tratta di credenziali di autenticazione client / utente o trust anchor di autenticazione server, assumendo che, se viene specificata una chiave privata, deve essere una credenziale di autenticazione client / utente. Nel tuo caso, si presume erroneamente che tu stia installando una credenziale di autenticazione client / utente anziché un trust anchor di autenticazione del server.

PS Per quanto riguarda la configurazione della sicurezza di rete, dovresti probabilmente configurare l'app in modo che consideri attendibile anche i trust anchor di "sistema" in modalità debug (sezione debug-overrides). In caso contrario, le build di debug dell'app non funzioneranno a meno che le connessioni non vengano eseguite tramite MiTM da un proxy il cui certificato CA è installato come attendibile sul dispositivo Android.


1
Per quanto riguarda il PS: la documentazione dice Trust anchors specified in debug-overrides are added to all other configurations. Quindi avevo l'impressione che fosse aggiunto a "base-config" e non lo avesse sostituito completamente?
mbonnin

Oh, hai ragione. Non è necessario elencare esplicitamente i trust anchor di "sistema" nei debug-override.
Alex Klyubin

4
Questa risposta non è chiara. Si prega di fare riferimento alla risposta di @ stkent di seguito.
Adam Hurwitz

4
D'accordo che questa risposta spiega cosa sta succedendo ma non è molto chiaro quali passi si dovrebbero fare.
StarWind0

114

La soluzione è non utilizzare .p12 , basta navigare con Chrome (con proxy configurato su wifi) su http://charlesproxy.com/getssl e installare il file .pem scaricato .

Ho avuto esattamente lo stesso problema sul mio Nexus 5X con Android 7.0. In precedenza era stato esportato .p12 da Charles 3.11.5 (Guida-> Proxying SSL-> Esporta certificato radice Charles e chiave privata). Quando ho provato a installare .p12 dal telefono (Impostazioni-> Sicurezza-> Installa da archivio) appare solo sotto "Credenziali utente" e mai in "Credenziali affidabili", e ovviamente SSL con proxy Charles non ha funzionato.

Il "how-to" totale per Android 7.0 sarebbe il seguente:

  1. Configura WiFi + proxy (come richiede Charles). Collegalo.
  2. Sul dispositivo, naviga con Chrome su http://charlesproxy.com/getssl , accetta la richiesta di download .pem, quindi premi "apri", avvia l'app "Installer certificati". Usalo per installare il certificato come "VPN e app".
  3. Mettere l'attributo android:networkSecurityConfig="@xml/network_security_config"a <application>in Manifest.xml
  4. Crea res / xml / network_security_config.xml con il contenuto del primo post (è totalmente corretto).
  5. Avvia Charles e l'app e divertiti.

PS Controlla data / ora sul dispositivo. Dovrebbe essere corretto.


2
Una nota importante su questa ottima risposta: se la tua app ha come target l'API 23 o inferiore, non hai bisogno dei passaggi 3 e 4. In effetti non sarai in grado di compilare le cose di configurazione della sicurezza di rete se hai l'API 23 o inferiore.
David Ferrand

1
Questa è un'ottima soluzione per Android 7.0. Molto più chiaro rispetto alle informazioni ufficiali di Charles Proxy.
Adam Link

3
Probabilmente solo io, ma questi passaggi non funzionano più per me in 7.1.1. Recentemente ho fatto un aggiornamento
satyajit

@satyajit Questa soluzione funziona per me su Android 7.1.1 su Google Pixel.
Dick Lucas

con o senza i passaggi 3 e 4?
satyajit

-1

Sono su Android 7.1.1, ecco come ho configurato sul mio dispositivo (OnePlus One) - senza la modifica di manifest (stavo prendendo di mira l'API 21 per la mia app):

In Charles Proxy:

  1. Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser. Questa procedura fornisce l' IP del proxy e il numero di porta e anche il collegamento a dove scaricare SSL proxy charles.

Sul tuo telefono:

  1. Wifi Settings > Modify Network > Advanced Options. Imposta Proxy su Manuale inserisci l'IP e il numero di porta ricevuti da Charles rispettivamente in Proxy hostnamee Proxy port.

  2. (FACOLTATIVO) Potresti o meno essere in grado di accedere al collegamento chls.pro/ssl fornito da Charles in precedenza. Sul mio dispositivo, sono stato sempre informato che non avevo una connessione di rete. Ho aggiunto charlesproxy.com al Bypass proxy forcampo.

  3. Sul tuo browser, vai al collegamento nel passaggio 3 e scarica il certificato necessario (se non funziona su Chrome, scarica Dolphin Browser). Puoi assegnare un nome al certificato con qualsiasi nome.

Di nuovo su Charles Proxy:

  1. Dovresti ricevere la richiesta a uno Allowo al Denytuo telefono di utilizzare il proxy se le tue impostazioni sono predefinite per richiedere connessioni remote.

Ora puoi usare Charles su Nougat 7.1.1.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.