109 votes

Comment faire fonctionner le proxy Charles avec Android 7 nougat ?

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 parviens plus à faire fonctionner mon proxy Charles.

Mon réseau_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 fonctionne en mode débogage. Mais quoi qu'il en soit, 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 pfx certificat de Settings -> Security -> Install from storage . Le certificat indique en User Credentials mais 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 ?

1 votes

En guise de test rapide, essayez d'ajouter/déplacer les éléments suivants user un dans le <base-config> et voir si ça change quelque chose. Ça ne devrait pas, mais ça ne prendra qu'un instant pour essayer.

0 votes

N'auriez-vous pas besoin d'ajouter l'autorité de certification explicite pour Charles dans la section developer.Android.com/formation/articles/security-config.html L'autorité de certification Charles est une autorité de certification autogénérée qui ne fait pas partie de 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 pouvoir l'ajouter manuellement sur mon téléphone de développement comme je le faisais auparavant. De Settings -> Security -> Install from storage

124voto

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

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

Le "mode d'emploi" total pour Android 7.0 serait comme ça :

  1. Configurer le WiFi + proxy (comme Charles le demande). Connectez-le.
  2. Sur l'appareil, naviguez avec Chrome vers http://charlesproxy.com/getssl Acceptez la demande de téléchargement de .pem, puis appuyez sur "ouvrir", ce qui lance l'application "Certificate installer". Utilisez-la pour installer le certificat comme "VPN et applications".
  3. Mettez l'attribut android:networkSecurityConfig="@xml/network_security_config" a <application> à Manifest.xml
  4. Créez 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 et l'heure sur l'appareil. Elle devrait être correcte.

2 votes

Une remarque importante concernant cette excellente réponse : si votre application vise l'API 23 ou une version inférieure, vous n'avez pas besoin des étapes 3 et 4. En fait, vous ne serez pas en mesure de compiler les éléments de configuration de la sécurité du réseau si vous avez l'API 23 ou une version inférieure.

1 votes

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

3 votes

Je suis sans doute le seul à le faire, mais ces étapes ne fonctionnent plus pour moi dans la version 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 site Github https://github.com/levyitay/AddSecurityExceptionAndroid

26voto

Alex Klyubin Points 2541

D'après le fil de commentaires de dépannage du PO, la réponse est d'installer uniquement le certificat de l'autorité de certification du proxy en tant que confiance, et non son certificat + sa clé privée.

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

  1. Installer non seulement le certificat CA du proxy MiTM mais aussi sa clé privée (ce qui permet aux applications VPN sur l'appareil de décrypter/MiTM le trafic réseau 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 de la Settings -> Security -> Install from storage pour les fichiers qui contiennent une clé privée en plus du ou des certificats. Ce changement de comportement a permis de démasquer le problème ci-dessus.

Avant Nougat, le Settings -> Security -> Install from storage pour les fichiers contenant une clé privée en plus des certs installaient par erreur les certs comme étant de confiance pour l'authentification du serveur (par exemple, HTTPS, TLS, faisant ainsi réussir votre MiTM), en plus d'être correctement installés comme certs clients utilisés pour authentifier cet appareil Android auprès des serveurs. Dans Nougat, le bug a été corrigé et ces certs ne sont plus installés comme étant de confiance pour l'authentification du serveur. Cela empêche les informations d'authentification du 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 Settings -> Security -> Install from storage ne fournit pas de moyen explicite pour 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 pour l'authentification serveur (juste un certificat d'autorité de certification -- aucune clé privée n'est nécessaire). Par conséquent, le Settings -> Security -> Install from storage flow devine s'il s'agit d'un justificatif 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'un justificatif d'authentification client/utilisateur. Dans votre cas, il a supposé à tort que vous installez un justificatif 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 qu'elle fasse également confiance aux ancres de confiance "système" en mode débogage (section debug-overrides). Sinon, les builds de débogage de l'application ne fonctionneront pas, à moins que les connexions ne soient MiTM'd par un proxy dont le certificat CA est installé comme fiable sur l'appareil Android.

1 votes

Concernant le PS : la documentation indique Trust anchors specified in debug-overrides are added to all other configurations . J'avais donc l'impression qu'il s'ajoutait à 'base-config' et ne le remplaçait pas complètement ?

0 votes

Oh, vous avez raison. Vous n'avez pas besoin de lister explicitement les ancres de confiance "système" dans debug-overrides.

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 release variante de construction. Sur debug travaillé.

0 votes

Cela est très probablement dû à la nework_security_config.xml ( developer.Android.com/training/articles/security-config )

0 votes

Je suis confronté au même problème. L'avez-vous résolu ? @kreker

-1voto

Cheruby Points 26

Je suis sur Android 7.1.1, voici comment je me suis installé sur mon appareil (OnePlus One) - sans le changement de manifeste (je visais 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 permet de IP et port du proxy ainsi que le lien vers l'endroit où vous devez télécharger le SSL de Charles Proxy.

Sur votre téléphone :

  1. Wifi Settings > Modify Network > Advanced Options . Définir le Proxy sur Manual et entrez le numéro d'IP et de port que vous avez reçu de Charles dans Proxy hostname y Proxy port respectivement.

  2. (FACULTATIF) Vous pouvez ou non avoir accès à l chls.pro/ssl lien 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 site charlesproxy.com à la liste des sites de Bypass proxy for champ.

  3. Sur votre navigateur, allez au 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 avec n'importe quel nom.

Retour sur Charles Proxy :

  1. Vous devriez être invité à Allow o Deny votre téléphone pour qu'il utilise le proxy si vos paramètres sont configurés par défaut pour vous inviter à vous connecter à distance.

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