¿Cómo hacer que Charles proxy funcione con Android 7 turrón?
ssl android-7.0-nougat (4)
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 ya no puedo hacer que mi proxy Charles 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
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
que
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
, obtengo
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
.
No hace falta decir que
pfx
un certificado
pfx
desde
Settings -> Security -> Install from storage
.
El certificado se muestra en
User Credentials
pero no en
Trusted credentials -> User
.
En mi dispositivo piruleta, los certificados se enumeran allí.
Estoy usando okhttp3 como biblioteca HTTP.
¿Alguna idea de lo que estoy haciendo mal?
Basado en el hilo de comentarios de resolución de problemas para el OP, la respuesta es instalar solo el certificado CA del proxy como confiable, no su clave privada cert +.
El problema fue causado por dos factores:
-
Instalar no solo el certificado CA del proxy MiTM sino también su clave privada (permitiendo así que las aplicaciones VPN en el dispositivo descifren / el tráfico de red MiTM de otras aplicaciones). No necesita la clave privada del proxy MiTM en el dispositivo.
-
Cambio de Android Nougat en el comportamiento de
Settings -> Security -> Install from storage
flujo deSettings -> Security -> Install from storage
para archivos que contienen una clave privada además de los certificados. Este cambio de comportamiento desenmascaró el problema anterior.
Antes de Nougat, la
Settings -> Security -> Install from storage
flujo de
Settings -> Security -> Install from storage
para archivos que contienen una clave privada, además de certs, instaló erróneamente los certificados como confiables para la autenticación del servidor (por ejemplo, HTTPS, TLS, haciendo que su MiTM tenga éxito), además para instalarse correctamente como certificados de cliente utilizados para autenticar este dispositivo Android en los servidores.
En Nougat, se solucionó el error y estos certificados ya no se instalan como confiables 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 evita que su MiTM tenga éxito.
Lo que complica las cosas es que la
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 certificación) o un ancla de confianza de autenticación de servidor (solo un Certificación CA: no se necesita clave privada).
Como resultado, la
Settings -> Security -> Install from storage
flujo de
Settings -> Security -> Install from storage
adivina si se trata de una credencial de autenticación de cliente / usuario o un ancla de confianza de autenticación de servidor al suponer 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.
PD 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 modo de depuración (sección de anulación de depuración). 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 CA esté instalado como confiable en el dispositivo Android.
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
Estoy en Android 7.1.1, así es como configuro en mi dispositivo (OnePlus One) - sin el cambio de manifiesto (estaba apuntando a API 21 para mi aplicación):
En Charles Proxy:
-
Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser
. Este paso le proporciona el número de puerto y la IP del proxy y también el enlace a donde debe descargar el proxy SSL de Charles.
En tu teléfono:
-
Wifi Settings > Modify Network > Advanced Options
. Establezca Proxy enManual
e ingrese la IP y el número de Puerto que recibió de Charles en elProxy hostname
Proxy port
y elProxy port
respectivamente. -
(OPCIONAL) Es posible que pueda o no acceder al enlace chls.pro/ssl provisto por Charles anteriormente. En mi dispositivo, siempre me notificaron que no tenía conexión de red. Agregué charlesproxy.com al
Bypass proxy for
campo. -
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 cualquier nombre.
De vuelta en Charles Proxy:
-
Debería recibir el mensaje
Allow
oDeny
su teléfono para usar el proxy si su configuración está predeterminada para solicitar conexiones remotas.
Ahora puede usar Charles en Nougat 7.1.1.
La solución es no usar .p12 , solo navegar con Chrome (con proxy configurado en wifi) a http://charlesproxy.com/getssl e instalar el archivo .pem descargado .
Tuve exactamente el mismo problema en mi Nexus 5X con Android 7.0. Anteriormente se exportó .p12 desde Charles 3.11.5 (Ayuda-> Proxying SSL-> Exportar certificado Charles Root y clave privada). Cuando traté de instalar .p12 desde el teléfono (Configuración-> Seguridad-> Instalar desde almacenamiento) aparece solo en "Credenciales de usuario" y nunca en "Credenciales de confianza", y por supuesto SSL con proxy de Charles no funcionó.
El "cómo" total para Android 7.0 sería así:
- Configure WiFi + proxy (como Charles lo requiere). Conéctalo.
- En el dispositivo, navegue con Chrome a http://charlesproxy.com/getssl , acepte la solicitud de descarga .pem, luego presione "abrir", se inicia la aplicación "Instalador de certificados". Úselo para instalar el certificado como "VPN y aplicaciones".
-
Coloque el atributo
android:networkSecurityConfig="@xml/network_security_config"
en<application>
en Manifest.xml - Cree res / xml / network_security_config.xml con contenido de la primera publicación (es totalmente correcto).
- Inicie Charles y la aplicación y diviértase.
PD Verifique la fecha / hora en el dispositivo. Debe ser correcto