¿Cómo hacer que Charles proxy funcione con Android 7 nougat?


Android 7 introdujo algunos cambios en la forma en que se manejan los certificados ( http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html ) y de alguna manera no puedo hacer que mi Charles proxy funcione más.

Mi 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>

Estoy corriendo en modo de depuración. Pero no importa qué, consigo javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found..

No hace falta decir que instalé un certificado pfx de Settings -> Security -> Install from storage. El certificado figura en User Credentials pero no en Trusted credentials -> User. En mi dispositivo lollipop, los certificados se enumeran allí.

Estoy usando okhttp3 como biblioteca HTTP.

¿Alguna idea de lo que estoy haciendo mal ?

Author: mbonnin, 2016-08-30

4 answers

Basado en el hilo de solución de problemas de los comentarios para el OP, la respuesta es instalar solo el certificado de CA del proxy como de confianza, no su cert + clave privada.

El problema fue causado por dos factores:

  1. Instalar no solo el certificado de CA del proxy MiTM, sino también su clave privada (lo que permite a las aplicaciones VPN en el dispositivo descifrar el tráfico de red/MiTM de otras aplicaciones). No necesita la clave privada del proxy MiTM en el dispositivo.

  2. Android Turrón cambio en el comportamiento del flujo Settings -> Security -> Install from storage para archivos que contienen una clave privada además de cert(s). Este cambio en el comportamiento desenmascaró el problema anterior.

Antes de Nougat, el flujo Settings -> Security -> Install from storage para los archivos que contienen una clave privada además de los certificados instaló erróneamente los certificados como de confianza para la autenticación del servidor (por ejemplo, HTTPS, TLS, lo que hace que su MiTM tenga éxito), además de estar instalado correctamente como certificados de cliente utilizados para autenticar este dispositivo Android a los servidores. En Turrón, el insecto era fijo y estos certificados ya no se instalan como de confianza para la autenticación del servidor. Esto evita que las credenciales de autenticación del cliente afecten (debiliten) la seguridad de las conexiones a los servidores. En su escenario, esto impide que su MiTM tenga éxito.

Lo que complica las cosas es que el Settings -> Security -> Install from storage no proporciona una forma explícita para que el usuario especifique si está instalando una credencial de autenticación de cliente (clave privada + cadena de cert) o un ancla de confianza de autenticación de servidor (solo un certificado de CA no no se necesita clave privada). Como resultado, el flujo Settings -> Security -> Install from storage adivina si se trata de una credencial de autenticación de cliente/usuario o de un ancla de confianza de autenticación de servidor asumiendo que, si se especifica una clave privada, debe ser una credencial de autenticación de cliente/usuario. En su caso, asumió incorrectamente que está instalando una credencial de autenticación de cliente/usuario en lugar de un ancla de confianza de autenticación de servidor.

P. S. Con respecto a su Configuración de Seguridad de Red, probablemente debería configurar la aplicación para que también confíe en los anclajes de confianza del "sistema" en el modo de depuración (sección debug-overrides). De lo contrario, las compilaciones de depuración de la aplicación no funcionarán a menos que las conexiones sean MITM'd por un proxy cuyo certificado de CA esté instalado como de confianza en el dispositivo Android.

 21
Author: Alex Klyubin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-30 01:37:02

La solución es no usar .p12 , simplemente navegue con Chrome (con proxy configurado en wifi) a http://charlesproxy.com/getssl y instalar descargado .pem file .

Tuve exactamente el mismo problema en mi Nexus 5X con Android 7.0. No fue exportado previamente .p12 de Charles 3.11.5 (Ayuda - > Proxy SSL- > Exportar el certificado raíz de Charles y la clave privada). Cuando intenté instalarlo .p12 desde el teléfono (Configuración- > Seguridad- > Instalar desde el almacenamiento) solo aparece en " Credenciales de usuario "y nunca en" Credenciales de confianza", y por supuesto SSL con Charles proxy no funcionó.

El total de "cómo" para Android 7.0 sería así:

  1. Configure WiFi + proxy (como Charles lo requiere). Conéctalo.
  2. En el dispositivo, navegue con Chrome a http://charlesproxy.com/getssl , aceptar solicitud de descarga .pem, a continuación, pulse "abrir", se inicia" Instalador de certificados " aplicación. Utilícelo para instalar el certificado como " VPN y apps".
  3. Ponga el atributo android:networkSecurityConfig="@xml/network_security_config" a <application> en el manifiesto.xml
  4. Cree res/xml/network_security_config.xml con contenido del primer post (es totalmente correcto).
  5. Lanzar Charles y aplicación y divertirse.

P.d. Compruebe la fecha / hora en el dispositivo. Debería ser correcto.

 95
Author: Alexander Skvortsov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-28 14:16:25

Escribí un script que inyecta el apk con las excepciones requeridas y permite usar Charles Proxy con la aplicación.

Este es el Github https://github.com/levyitay/AddSecurityExceptionAndroid

 23
Author: Itay Levy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-03 06:17:09

Estoy en Android 7.1.1, así es como configuro en mi dispositivo (OnePlus One) - sin el cambio de manifiesto (estaba apuntando API 21 para mi aplicación):

En Charles Proxy:

  1. Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser. Este paso le da el número de IP y puerto del proxy y también el enlace a donde debe descargar charles proxy SSL.

En su teléfono:

  1. Wifi Settings > Modify Network > Advanced Options. Establezca el proxy en Manual e ingrese la IP y el número de puerto que recibió de Charles en Proxy hostname y Proxy port respectivamente.

  2. (OPCIONAL) Puede o no ser capaz de acceder a la chls.pro/ssl enlace proporcionado por Charles anteriormente. En mi dispositivo, siempre me notificaron que no tenía conexión de red. He añadido el charlesproxy.com al campo Bypass proxy for.

  3. En su navegador, vaya al enlace en el paso 3 y descargue el certificado necesario (si no funciona en Chrome, descargue Dolphin Browser).Puede nombrar su certificado con lo que sea nombre.

De vuelta en Charles Proxy:

  1. Debe obtener el mensaje a Allow o Deny su teléfono para usar el proxy si su configuración está predeterminada para solicitarle conexiones remotas.

Ahora puedes usar Charles en Nougat 7.1.1.

 1
Author: Cheruby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-28 14:35:20