Comment faire fonctionner le proxy Charles avec Android 7 Nougat?

101

Android 7 a introduit quelques changements dans la façon dont les certificats sont gérés ( http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html ) et je ne peux plus faire fonctionner mon proxy Charles.

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

Je cours en mode débogage. Mais quoi qu'il arrive, j'obtiens javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found..

Inutile de dire que j'ai installé un pfxcertificat à partir de Settings -> Security -> Install from storage. Le certificat apparaît dans User Credentialsmais pas dans Trusted credentials -> User. Sur mon appareil Lollipop, les certificats y sont répertoriés.

J'utilise okhttp3 comme bibliothèque HTTP.

Une idée de ce que je fais mal?

Mbonnin
la source
1
Comme test rapide, essayez d'ajouter / de déplacer celui- userci dans le <base-config>et voyez si cela change. Cela ne devrait pas, mais cela ne prendra qu'un moment pour essayer.
CommonsWare
N'auriez-vous pas besoin d'ajouter l'autorité de certification explicite pour Charles dans developer.android.com/training/articles/security-config.html : `` Faire confiance aux autorités de certification supplémentaires '' car l'autorité de certification Charles est une autorité auto-générée et ne serait pas dans le Chaîne de confiance du système Android?
Morrison Chang
@Morisson Chang: Je ne veux pas intégrer le CA Charles dans l'application, je veux pouvoir l'ajouter manuellement sur mon téléphone de développement comme je le faisais auparavant. DeSettings -> Security -> Install from storage
mbonnin
1. Comment faites-vous référence au network_security_config.xml dans AndroidManifest.xml de votre application? 2. Pouvez-vous lier le fichier .pfx? Je suppose qu'il ne contient que le certificat CA (pas de clés privées) et devrait donc être publié. Je demande parce que, si le .pfx contient une clé privée, il sera supposé être un fichier de certificat client et donc CA du fichier ne sera pas installé comme approuvé pour l'authentification du serveur.
Alex Klyubin
1
@AlexKlyubin hurra, ça marche maintenant :). Je suppose que j'avais besoin de redémarrer mon charles ou mon application ou quoi que ce soit d'autre. J'étais confus parce que j'ai installé le même fichier .pfx sur d'innombrables appareils Android avant Nougat et ils ont été reconnus ok. Mais tout va bien maintenant. Pouvez-vous rédiger une réponse pour que je puisse l'approuver?
mbonnin

Réponses:

26

Sur la base du fil de dépannage des commentaires pour l'OP, la réponse est d'installer uniquement le certificat CA du proxy comme étant approuvé, et non son certificat + clé privée.

Le problème était dû à deux facteurs:

  1. Installer non seulement le certificat CA du proxy MiTM, mais également sa clé privée (permettant ainsi aux applications VPN sur l'appareil de décrypter le trafic réseau / MiTM à partir d'autres applications). Vous n'avez pas besoin de la clé privée du proxy MiTM sur l'appareil.

  2. Android Nougat changement de comportement du Settings -> Security -> Install from storageflux pour les fichiers qui contiennent une clé privée en plus des cert (s). Ce changement de comportement a démasqué le problème ci-dessus.

Avant Nougat, le Settings -> Security -> Install from storageflux des fichiers contenant une clé privée en plus des certificats installait à tort les certificats comme étant fiables pour l'authentification du serveur (par exemple, HTTPS, TLS, faisant ainsi réussir votre MiTM), en plus d'être correctement installé en tant que certificats client utilisés pour authentifier cet appareil Android auprès des serveurs. Dans Nougat, le bogue a été corrigé et ces certificats ne sont plus installés comme approuvés pour l'authentification du serveur. Cela empêche les informations d'authentification client d'affecter (d'affaiblir) la sécurité des connexions aux serveurs. Dans votre scénario, cela empêche votre MiTM de réussir.

Ce qui complique les choses, c'est que le Settings -> Security -> Install from storagene fournit pas un moyen explicite à l'utilisateur de spécifier s'il installe un justificatif d'authentification client (clé privée + chaîne de certificats) ou une ancre de confiance d'authentification serveur (juste un certificat CA - aucune clé privée nécessaire) . En conséquence, le Settings -> Security -> Install from storageflux devine s'il s'agit d'informations d'identification d'authentification client / utilisateur ou d'ancre d'approbation d'authentification serveur en supposant que, si une clé privée est spécifiée, il doit s'agir d'informations d'identification d'authentification client / utilisateur. Dans votre cas, il a supposé à tort que vous installez une information d'identification d'authentification client / utilisateur plutôt qu'une ancre d'approbation d'authentification de serveur.

PS En ce qui concerne votre configuration de sécurité réseau, vous devriez probablement configurer l'application pour qu'elle fasse également confiance aux ancres de confiance "système" en mode débogage (section debug-overrides). Sinon, les versions de débogage de l'application ne fonctionneront pas à moins que les connexions ne soient effectuées par un proxy dont le certificat CA est installé comme approuvé sur l'appareil Android.

Alex Klyubin
la source
1
Concernant le PS: la documentation dit Trust anchors specified in debug-overrides are added to all other configurations. J'avais donc l'impression qu'il ajoutait à 'base-config' et ne l'avait pas complètement remplacé?
mbonnin
Oh, tu as raison. Vous n'avez pas besoin de lister explicitement les ancres de confiance "système" dans les remplacements de débogage.
Alex Klyubin
4
Cette réponse n'est pas claire. Veuillez vous référer à la réponse de @ stkent ci-dessous.
Adam Hurwitz
4
D'accord, cette réponse explique ce qui se passe, mais les étapes à suivre sont très floues.
StarWind0
114

La solution est de ne pas utiliser .p12 , il suffit de naviguer avec Chrome (avec un proxy configuré sur le wifi) vers http://charlesproxy.com/getssl et d' installer le fichier .pem téléchargé .

J'ai eu exactement le même problème sur mon Nexus 5X sous Android 7.0. Il était précédemment exporté .p12 de Charles 3.11.5 (Aide-> Proxication SSL-> Exporter le certificat racine Charles et la clé privée). Lorsque j'ai essayé d'installer .p12 à partir du téléphone (Paramètres-> Sécurité-> Installer à partir du stockage), il n'apparaît que sous "Informations d'identification de l'utilisateur" et jamais sous "Informations d'identification de confiance", et bien sûr SSL avec le proxy Charles ne fonctionnait pas.

Le "mode d'emploi" total pour Android 7.0 serait le suivant:

  1. Configurez le proxy WiFi + (comme Charles l'exige). Connectez-le.
  2. Sur l'appareil, naviguez avec Chrome vers http://charlesproxy.com/getssl , acceptez la demande de téléchargement .pem, puis appuyez sur «Ouvrir», il lance l'application «Installateur de certificat». Utilisez-le pour installer le certificat en tant que "VPN et applications".
  3. Mettez l'attribut android:networkSecurityConfig="@xml/network_security_config"à <application>au Manifest.xml
  4. Créez res / xml / network_security_config.xml avec le contenu du premier message (c'est tout à fait correct).
  5. Lancez Charles et l'application et amusez-vous.

PS Vérifiez la date / l'heure sur l'appareil. Cela devrait être correct.

Alexander Skvortsov
la source
2
Une note importante sur cette excellente réponse: si votre application cible l'API 23 ou une version antérieure, vous n'avez pas besoin des étapes 3 et 4. En fait, vous ne pourrez pas compiler les éléments de configuration de sécurité réseau si vous avez l'API 23 ou plus bas.
David Ferrand
1
C'est une excellente solution pour Android 7.0. Beaucoup plus clair que les informations officielles de Charles Proxy.
Adam Link
3
Probablement que moi, mais ces étapes ne fonctionnent plus pour moi en 7.1.1. J'ai récemment fait une mise à jour
satyajit
@satyajit Cette solution fonctionne pour moi sur Android 7.1.1 sur un Google Pixel.
Dick Lucas
avec ou sans étapes 3 et 4?
satyajit
-1

Je suis sous Android 7.1.1, voici comment je configure sur mon appareil (OnePlus One) - sans changement de manifeste (je ciblais l'API 21 pour mon application):

Dans Charles Proxy:

  1. Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser. Cette étape vous donne l' adresse IP du proxy et le numéro de port, ainsi que le lien vers où vous devez télécharger le proxy SSL de Charles.

Sur votre téléphone:

  1. Wifi Settings > Modify Network > Advanced Options. Définissez Proxy sur Manualet entrez l'adresse IP et le numéro de port que vous avez reçus de Charles dans Proxy hostnameet Proxy portrespectivement.

  2. (FACULTATIF) Vous pouvez ou non être en mesure d'accéder au lien chls.pro/ssl fourni par Charles plus tôt. Sur mon appareil, j'étais toujours informé que je n'avais pas de connexion réseau. J'ai ajouté le charlesproxy.com sur le Bypass proxy forterrain.

  3. Sur votre navigateur, accédez au lien de l'étape 3 et téléchargez le certificat nécessaire (s'il ne fonctionne pas sur Chrome, téléchargez Dolphin Browser) .Vous pouvez nommer votre certificat avec n'importe quel nom.

De retour sur Charles Proxy:

  1. Vous devriez recevoir l'invite à l'un Allowou à l'autre de Denyvotre téléphone pour utiliser le proxy si vos paramètres sont définis par défaut pour vous demander des connexions à distance.

Vous pouvez maintenant utiliser Charles sur Nougat 7.1.1.

Tiffany
la source