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 :
-
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.
-
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
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
0 votes
1. Comment faites-vous référence au fichier network_security_config.xml dans le fichier AndroidManifest.xml de votre application ? 2. Pouvez-vous lier le fichier .pfx ? Je suppose qu'il ne contient que le certificat de l'autorité de certification (pas de clés privées) et qu'il peut donc être publié sans problème. Je pose la question parce que, si le fichier .pfx contient une clé privée, il sera considéré comme un fichier de certificat client et l'autorité de certification du fichier ne sera pas installée comme fiable pour l'authentification du serveur.
0 votes
@Alex Klyubin : Mon fichier .pfx original contenait en effet une clé privée. Je viens de passer au fichier .crt avec un seul certificat à l'intérieur. Pas de chance jusqu'à présent. Je vais essayer plus fort, redémarrer toutes les choses et vous tenir au courant.
1 votes
@AlexKlyubin hurra, ça marche maintenant :). Je suppose que j'ai dû redémarrer mon charles ou l'application ou autre chose. J'étais confus parce que j'ai installé le même fichier .pfx sur d'innombrables appareils Android avant nougat et ils ont été reconnus ok. Mais tout va bien maintenant. Pourriez-vous écrire une réponse pour que je puisse l'approuver ?