Comment faire pour que charles proxy travaille avec Android 7 nougat?

Android 7 introduit quelques changements à la façon dont les certificats sont traités ( http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html ) et d'une manière ou d'une autre Je ne peux plus faire fonctionner mon mandataire 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>

j'exécute en mode débogueur. Mais quoi qu'il arrive, je reçois 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 User Credentials mais pas Trusted credentials -> User . Sur ma sucette appareil, les certificats sont répertoriés.

j'utilise okhttp3 comme bibliothèque HTTP.

une idée de ce que je fais de mal ?

81
demandé sur mbonnin 2016-08-30 00:06:57

4 réponses

basé sur le thread de dépannage des commentaires pour L'OP, la réponse est d'installer juste le CA cert du proxy comme confiance, pas sa clé privée cert+.

la question a été causée par deux facteurs:

  1. " installer non seulement le CA cert du mandataire MiTM, mais aussi sa clé privée (permettant ainsi aux applications VPN sur l'appareil de déchiffrer le trafic réseau MiTM à partir d'autres applications). Vous n'avez pas besoin de la clé privée du mandataire MiTM sur l'appareil.

  2. Android Nougat changement de comportement du flux Settings -> Security -> Install from storage pour les fichiers qui contiennent une clé privée en plus de cert(s). Ce changement de comportement a démasqué la question ci-dessus.

avant Nougat, le Settings -> Security -> Install from storage flux pour les fichiers contenant une clé privée en plus de certs installé par erreur les certs comme confiance pour l'authentification du serveur (par exemple, HTTPS, TLS, ce qui rend votre MiTM succès), en en plus d'être correctement installé comme client certs utilisé pour l'authentification de cet appareil Android sur les serveurs. À Nougat, le bug a été corrigé et ces certs ne sont plus installés comme prévu pour l'authentification du serveur. Cela empêche les justificatifs d'authentification des clients d'affecter 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 explicite manière pour l'utilisateur de spécifier s'il installe un justificatif d'authentification client (clé privée + chaîne cert) ou un serveur d'authentification d'ancrage de confiance (juste un cert CA -- pas de clé privée Nécessaire). Par conséquent, le flux Settings -> Security -> Install from storage devine s'il s'agit d'une authentification client/utilisateur ou d'un point d'ancrage de confiance d'authentification serveur en présumant que, si une clé privée est spécifiée, il doit s'agir d'une authentification client/utilisateur. Dans votre cas, il a supposé à tort que vous êtes installation d'un justificatif d'authentification client/utilisateur plutôt que d'un point d'ancrage 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 aussi confiance aux ancrages de confiance "système" en mode de débogage (section debug-overrides). Autrement debug construit de l'application ne fonctionnera pas à moins que les connexions soient Mitm'D par un proxy dont CA cert est installé comme confiance sur L'appareil Android.

21
répondu Alex Klyubin 2016-08-30 01:37:02

la solution est ne pas utiliser .p12 , il suffit de naviguer avec Chrome (avec proxy configuré sur wifi) à http://charlesproxy.com/getssl et install downloaded .fichier pem .

j'ai eu exactement le même problème sur mon Nexus 5x avec Android 7.0. Il était auparavant exporté .p12 de Charles 3.11.5 (Aide->SSL Proxy->Exporter Charles Racine certificat et la clé Privée). Quand j'ai essayé de l'installer .p12 de téléphone (Paramètres->Sécurité->Installation de stockage), il n'apparaît que sous "informations d'identification d'Utilisateur" et jamais à des "certificats de Confiance", et bien sûr SSL avec Charles proxy ne fonctionne pas.

La totale "comment faire" pour Android 7.0 serait comme ça:

  1. configurer WiFi + proxy (comment Charles l'exige). Se connecter à elle.
  2. sur l'appareil, naviguer avec Chrome à http://charlesproxy.com/getssl , d'accepter la demande pour le téléchargement .pem, puis appuyez sur "Ouvrir", il lance l'application" Certificate installer". Utilisez - le pour installer le certificat en tant que "VPN et applications".
  3. mettre l'attribut android:networkSecurityConfig="@xml/network_security_config" à <application> au Manifeste.xml
  4. créer res/xml/network_security_config.xml avec le contenu du premier post (il est tout à fait correct).
  5. Lancez Charles et app et amusez-vous.

PS.Date/Heure de contrôle sur l'appareil. Ça devrait être correct.

95
répondu Alexander Skvortsov 2017-03-28 14:16:25

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

C'est le Github https://github.com/levyitay/AddSecurityExceptionAndroid

23
répondu Itay Levy 2016-12-03 06:17:09

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

In Charles Proxy:

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

sur votre téléphone:

  1. Wifi Settings > Modify Network > Advanced Options . Définissez Proxy à Manual et entrez L'adresse IP et le numéro de Port que vous avez reçus de Charles dans Proxy hostname et Proxy port respectivement.

  2. (optionnel) vous pouvez ou non avoir accès au chls.pro / ssl lien fourni par Charles earlier. Sur mon appareil, j'ai toujours été informé que je n'avais pas de connexion réseau. J'ai ajouté charlesproxy.com au 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 avec n'importe quel nom.

Retour sur Charles Proxy:

  1. vous devriez obtenir le prompt à Allow ou Deny votre téléphone pour utiliser le proxy si vos paramètres sont par défaut pour vous inviter à distance connexion.

vous pouvez maintenant utiliser Charles sur Nougat 7.1.1.

1
répondu Cheruby 2017-04-28 14:35:20