web-dev-qa-db-fra.com

Comment faire fonctionner le proxy charles avec le nougat Android 7?

Android 7 a modifié 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 à créer mon proxy Charles. ne travaille plus.

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 peu importe, 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 certificat pfx à partir de Settings -> Security -> Install from storage. Le certificat s'affiche dans User Credentials mais pas dans Trusted credentials -> User. Sur mon appareil Lollipop, les certificats sont répertoriés ici. 

J'utilise okhttp3 comme bibliothèque HTTP.

Une idée de ce que je fais mal?

85
mbonnin

Sur la base du fil de dépannage des commentaires pour l'OP, la solution consiste à installer uniquement le certificat d'autorité de certification du proxy comme étant de confiance, et non son certificat + clé privée.

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

  1. Installer non seulement le certificat d'autorité de certification 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 le périphérique.

  2. Android Nougat change le comportement du flux Settings -> Security -> Install from storage pour les fichiers contenant une clé privée en plus des certificats. Ce changement de comportement a permis de masquer le problème ci-dessus.

Avant Nougat, le flux Settings -> Security -> Install from storage 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, assurant ainsi la réussite de votre MiTM), en plus d'être correctement installé en tant que certificats client utilisés pour authentifier cet appareil Android sur les 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'identification 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 est compliqué, c’est que le Settings -> Security -> Install from storage ne fournit pas à l’utilisateur un moyen explicite d’indiquer s’il installe un justificatif d’authentification client (chaîne privée + chaîne de cert) 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 Settings -> Security -> Install from storage détermine s'il s'agit d'un justificatif d'authentification client/utilisateur ou d'une ancre de confiance pour l'authentification 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 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 faire également confiance aux ancres "système" en mode débogage (section debug-overrides). Sinon, les versions de débogage de l'application ne fonctionneront que si les connexions sont définies par MiTM par un proxy dont le certificat d'autorité de certification est installé en tant qu'utilisateur approuvé sur le périphérique Android.

23
Alex Klyubin

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

J'ai eu exactement le même problème sur mon Nexus 5X fonctionnant sous Android 7.0 . Il y avait précédemment exporté .p12 à partir de Charles 3.11.5 (Aide-> Proxy SSL -> Exporter le certificat Charles Root et la clé privée). Lorsque j'ai essayé d'installer .p12 à partir d'un téléphone (Paramètres-> Sécurité-> Installer à partir d'un stockage), il n'apparaît que sous "Informations d'identification de l'utilisateur" et jamais sous "Informations d'identification approuvées". Bien entendu, SSL avec proxy Charles ne fonctionnait pas.

Le "comment faire" pour Android 7.0 serait comme ça:

  1. Configurez WiFi + proxy (comme Charles le requiert). 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" pour lancer l'application "Installer le certificat". Utilisez-le pour installer le certificat en tant que "VPN et applications". 
  3. Placez l'attribut Android:networkSecurityConfig="@xml/network_security_config" à <application> dans Manifest.xml
  4. Créez le fichier res/xml/network_security_config.xml avec le contenu du premier message (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. Cela devrait être correct.

99
Alexander Skvortsov

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

26
Itay Levy

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

Dans Charles Proxy:

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

Sur votre téléphone:

  1. Wifi Settings > Modify Network > Advanced Options. Définissez le proxy sur 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. (FACULTATIF) Vous pouvez ou non pouvoir accéder au lien chls.pro/ssl fourni précédemment par Charles. Sur mon appareil, j'ai toujours été informé que je n'avais aucune connexion réseau. J'ai ajouté le charlesproxy.com au champ Bypass proxy for

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

Retour sur Charles Proxy:

  1. Vous devez obtenir l'invite Allow ou Deny de votre téléphone pour utiliser le proxy si vos paramètres vous invitent par défaut à vous connecter à distance.

Vous pouvez maintenant utiliser Charles sur Nougat 7.1.1.

0
Cheruby