109 votes

Comment faire fonctionner Charles Proxy avec Android 7 Nougat?

Android 7 a introduit quelques modifications dans la façon dont les certificats sont gérés (http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html) et d'une manière ou d'une autre, je ne parviens plus à 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 que j'ai installé un certificat pfx depuis Paramètres -> Sécurité -> Installer à partir du stockage. Le certificat apparaît dans Crédential utilisateur mais pas dans Crédential de confiance -> Utilisateur. Sur mon appareil lollipop, les certificats sont listés là-bas.

J'utilise okhttp3 comme bibliothèque HTTP.

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

1 votes

En tant que test rapide, essayez d'ajouter/de déplacer l'élément user dans le et voyez si cela change quelque chose. Cela ne devrait pas, mais cela ne prendra qu'un instant à essayer.

0 votes

N'auriez-vous pas besoin d'ajouter le CA explicite pour Charles dans developer.android.com/training/articles/security-config.html : 'Faire confiance à des AC 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 CA Charles dans l'application, je veux pouvoir l'ajouter manuellement sur mon téléphone de développement comme je le faisais avant. Depuis 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 fonctionnant sous Android 7.0. Un fichier .p12 avait été exporté auparavant depuis Charles 3.11.5 (Aide->Proxy SSL->Exporter le certificat racine de Charles et la clé privée). Lorsque j'ai essayé d'installer le fichier .p12 depuis le téléphone (Paramètres->Sécurité->Installer à partir du stockage), il apparaissait uniquement sous "Certificats utilisateur" et jamais sous "Certificats de confiance", et bien sûr SSL avec le proxy Charles ne fonctionnait pas.

La procédure "comment faire" pour Android 7.0 serait la suivante :

  1. Configurer le WiFi + le proxy (comme Charles le requiert). 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-la pour installer le certificat en tant que "VPN et apps".
  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 tout à fait correct).
  5. Lancez Charles et l'application et amusez-vous.

P.S. Vérifiez la date et l'heure sur l'appareil. Elles doivent être correctes.

2 votes

Une note importante sur cette excellente réponse : si votre application cible API 23 ou moins, vous n'avez pas besoin des étapes 3 et 4. En fait, vous ne pourrez pas compiler les éléments network-security-config si vous avez 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

Il est probable que ce soit juste moi, mais ces étapes ne fonctionnent plus pour moi dans la version 7.1.1. J'ai récemment effectué 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

Basé sur le fil de dépannage des commentaires pour l'OP, la réponse est d'installer uniquement le certificat CA du proxy en tant que certifié, pas son certificat + clé privée.

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

  1. 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 des autres applications). Vous n'avez pas besoin de la clé privée du proxy MiTM sur l'appareil.

  2. Modification du comportement d'Android Nougat dans le flux de Paramètres -> Sécurité -> Installer à partir du stockage pour les fichiers contenant une clé privée en plus des certificats. Ce changement de comportement a mis en lumière le problème ci-dessus.

Avant Nougat, le flux de Paramètres -> Sécurité -> Installer à partir du stockage pour les fichiers contenant une clé privée en plus des certificats installait par erreur les certificats comme étant de confiance pour l'authentification du serveur (par exemple, HTTPS, TLS, facilitant 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 comme étant 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 la réussite de votre MiTM.

Ce qui complique les choses, c'est que le flux de Paramètres -> Sécurité -> Installer à partir du stockage ne fournit pas de moyen explicite à l'utilisateur pour 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 (juste un certificat CA -- pas de clé privée nécessaire). En conséquence, le flux de Paramètres -> Sécurité -> Installer à partir du 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 debug-overrides). Sinon, les versions debug de l'application ne fonctionneront pas à moins que les connexions ne soient interceptées par un proxy dont le certificat CA est installé en tant que de confiance sur l'appareil Android.

1 votes

En ce qui concerne le PS : la documentation indique que les points d'ancrage de confiance spécifiés dans les remplacements de débogage sont ajoutés à toutes les autres configurations. J'avais donc l'impression qu'ils étaient ajoutés à 'base-config' et non remplacés complètement ?

0 votes

Oh, tu as raison. Vous n'avez pas besoin de répertorier explicitement les ancrages de confiance "system" dans les remplacements de débogage.

4 votes

Cette réponse n'est pas 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. Dans debug, cela fonctionnait.

0 votes

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

0 votes

Je rencontre le même problème. Avez-vous réussi à le résoudre ? @kreker

-1voto

Cheruby Points 26

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

Dans Charles Proxy :

  1. Aide > SSL Proxying > Installer le certificat racine de Charles sur un appareil mobile ou un navigateur distant. Ces étapes vous donnent l'IP et le numéro de port du proxy ainsi que le lien où vous devez télécharger le certificat SSL de charles proxy.

Sur votre téléphone :

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

  2. (FACULTATIF) Vous pouvez ou non accéder au lien chls.pro/ssl fourni par Charles auparavant. Sur mon appareil, j'ai toujours été informé que je n'avais pas de connexion réseau. J'ai ajouté charlesproxy.com dans le champ Bypass proxy for.

  3. Sur votre navigateur, allez sur le lien de l'étape 3 et téléchargez le certificat nécessaire (si cela 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 demande de Permettre 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