109 votes

Comment faire fonctionner Charles Proxy avec Android 7 Nougat ?

Android 7 a introduit quelques changements dans la manière dont les certificats sont gérés (http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html) et je ne parviens pas à faire fonctionner mon proxy Charles.

Mon network_security_config.xml :

Je suis en mode debug. Mais quoi que je fasse, j'obtiens javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found..

Inutile de dire, j'ai bien installé un certificat pfx depuis Paramètres -> Sécurité -> Installer à partir du stockage. Le certificat s'affiche dans Identifiants utilisateur mais pas dans Identifiants approuvés -> Utilisateur. Sur mon appareil lollipop, les certificats sont répertoriés là-bas.

J'utilise okhttp3 comme bibliothèque HTTP.

Avez-vous une idée de ce que je fais mal ?

1 votes

En tant que test rapide, essayez d'ajouter/déplacer l'utilisateur dans la pour voir si cela change quelque chose. Normalement, cela ne devrait pas, mais cela ne prendra qu'un instant à essayer.

0 votes

Ne devriez-vous pas ajouter le CA explicite pour Charles dans developer.android.com/training/articles/security-config.html : 'Faire confiance à des CA supplémentaires', car le CA de Charles est auto-généré et ne serait pas dans la chaîne de confiance du système Android ?

0 votes

@Morisson Chang : Je ne veux pas intégrer le Charles CA dans l'application, je veux être en mesure de l'ajouter manuellement sur mon téléphone de développement comme je le faisais avant. De Paramètres -> Sécurité -> Installer à partir du stockage

124voto

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 exactement eu le même problème sur mon Nexus 5X avec Android 7.0. Il y avait précédemment un fichier .p12 exporté depuis Charles 3.11.5 (Aide->Proxy SSL->Exporter le certificat Charles et la clé privée). Lorsque j'ai essayé d'installer .p12 depuis le téléphone (Paramètres->Sécurité->Installer depuis le stockage), il n'apparaît que sous "Certificats utilisateur" et jamais sous "Certificats de confiance", et bien sûr le SSL avec le proxy Charles ne fonctionnait pas.

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

  1. Configurer le WiFi + le proxy (comme Charles le demande). Connectez-vous.
  2. Sur l'appareil, naviguez avec Chrome vers http://charlesproxy.com/getssl, acceptez la demande de téléchargement du fichier .pem, puis appuyez sur "ouvrir", cela lance l'application "Installateur de certificat". Utilisez-le pour installer le certificat comme "VPN et applications".
  3. Ajoutez l'attribut android:networkSecurityConfig="@xml/network_security_config" à dans le fichier Manifest.xml.
  4. Créez le fichier res/xml/network_security_config.xml avec le contenu du premier post (il est totalement correct).
  5. Lancez Charles et l'application et amusez-vous.

P.S. Vérifiez la date/heure sur l'appareil. Elle doit être correcte.

2 votes

Une note importante sur cette excellente réponse : si votre application cible l'API 23 ou moins, 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 une API 23 ou moins.

1 votes

Ceci est une excellente solution pour Android 7.0. Beaucoup plus claire que les informations officielles de Charles Proxy.

3 votes

Probablement seulement moi mais ces étapes ne fonctionnent plus pour moi dans 7.1.1. J'ai récemment fait une mise à jour

29voto

Itay Levy Points 261

J'ai écrit un script qui injecte l'apk avec les exceptions requises et permet d'utiliser Charles Proxy avec l'application.

Voici le Github https://github.com/levyitay/AddSecurityExceptionAndroid

26voto

Alex Klyubin Points 2541

Sur la base du fil de dépannage des commentaires pour l'OP, la réponse consiste à installer uniquement le certificat CA du proxy en tant que certificat de confiance, pas son certificat + clé privée.

Le problème a été causé par deux facteurs :

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

  2. Le changement de comportement dans Android Nougat du flux Paramètres -> Sécurité -> Installer depuis le stockage pour les fichiers contenant une clé privée en plus des certificats. Ce changement de comportement a révélé le problème ci-dessus.

Avant Nougat, le flux Paramètres -> Sécurité -> Installer depuis le stockage pour les fichiers contenant une clé privée en plus des certificats installait de manière erronée les certificats en tant que certificats de confiance pour l'authentification du serveur (par exemple, HTTPS, TLS, permettant ainsi la réussite de votre MiTM), en plus d'être correctement installés en tant que certificats clients 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 en tant que certificats de confiance pour l'authentification du serveur. Cela empêche les informations d'authentification client d'affecter (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 flux Paramètres -> Sécurité -> Installer depuis le stockage ne fournit pas de moyen explicite à l'utilisateur de spécifier s'il installe une information d'authentification client (clé privée + chaîne de certificats) ou une ancre de confiance pour l'authentification du serveur (uniquement un certificat CA -- aucune clé privée nécessaire). En conséquence, le flux Paramètres -> Sécurité -> Installer depuis le stockage devine s'il s'agit d'une information d'authentification client/utilisateur ou d'une ancre de confiance pour l'authentification du serveur en supposant que, si une clé privée est spécifiée, il doit s'agir d'une information d'authentification client/utilisateur. Dans votre cas, il a incorrectement supposé que vous installiez une information d'authentification client/utilisateur plutôt qu'une ancre de confiance pour l'authentification du serveur.

P. S. En ce qui concerne votre Configuration de sécurité réseau, vous devriez probablement configurer l'application pour également faire confiance aux ancres de confiance "système" en mode debug (section de remplacement en mode debug). Sinon, les builds de debug de l'application ne fonctionneront pas sauf si les connexions sont interceptées par un proxy dont le certificat CA est installé en tant que certificat de confiance sur l'appareil Android.

1 votes

En ce qui concerne le PS : la documentation indique Les ancrages de confiance spécifiés dans les remplacements de débogage sont ajoutés à toutes les autres configurations. J'étais donc sous l'impression que cela ajoutait à 'base-config' et ne le remplaçait pas complètement ?

0 votes

Oh, tu as raison. Tu n'as pas besoin de répertorier explicitement les ancrages de confiance "système" dans les substituts de débogage.

4 votes

Cette réponse est peu claire. Veuillez vous référer à la réponse de @stkent ci-dessous.

0voto

kreker Points 1447

Pour moi, le proxy SSL ne fonctionnait pas dans la variante de build release. En debug, cela fonctionnait.

0 votes

Il s'agit probablement du fichier nework_security_config.xml (developer.android.com/training/articles/security-config)

0 votes

Je fais face au même problème. Avez-vous résolu cela? @kreker

-1voto

Cheruby Points 26

Je suis sur Android 7.1.1, voici comment j'ai configuré mon appareil (OnePlus One) - sans modifier le manifeste (je ciblais l'API 21 pour mon application) :

Dans Charles Proxy :

  1. Aide > Proxy SSL > Installer le certificat racine de Charles sur un appareil mobile ou navigateur distant. Cette étape vous donne l'adresse IP et le numéro de port du proxy ainsi que le lien vers lequel vous devez télécharger le certificat SSL de Charles.

Sur votre téléphone :

  1. Paramètres Wi-Fi > Modifier le réseau > Options avancées. Définissez le Proxy sur Manuel et saisissez l'adresse IP et le numéro de port que vous avez reçu de Charles dans les champs Nom du proxy et Port du proxy respectivement.

  2. (OPTIONNEL) Vous pourriez ou non pouvoir accéder au lien chls.pro/ssl fourni par Charles plus tôt. Sur mon appareil, j'ai toujours été notifié que je n'avais pas de connexion réseau. J'ai ajouté charlesproxy.com dans le champ Contourner le proxy pour.

  3. Sur votre navigateur, allez sur le lien de l'étape 3 et téléchargez le certificat nécessaire (si ça ne fonctionne pas sur Chrome, téléchargez Dolphin Browser). Vous pouvez nommer votre certificat comme vous le souhaitez.

Retour sur Charles Proxy :

  1. Vous devriez recevoir une notification pour Autoriser ou Refuser l'utilisation du proxy sur votre téléphone si vos paramètres sont configurés pour vous demander pour les connexions distantes.

Vous pouvez maintenant utiliser Charles sur Nougat 7.1.1.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X