¿Cómo obtener charles proxy trabajo con Android 7 turrón?
Android 7 introdujo algunos cambios en la manera 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 proxy Charles funcione más.
Mi network_security_config.xml:
- Android: conexión HTTPS (SSL) mediante HttpsURLConnection
- ¿Deshabilitar la validación del certificado SSL de la conexión HTTPS?
- Certificado particular de confianza solamente emitido por CA - Android
- Solicitud HTTP de SSL de Android mediante cert auto-firmado y CA
- Comodo SSL: ERR_CERT_AUTHORITY_INVALID en Chrome móvil y Opera móvil (Android)
<?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 funcionando 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 pfx
un certificado pfx
en Settings -> Security -> Install from storage
. El certificado aparece en User Credentials
pero no en Trusted credentials -> User
. En mi dispositivo lollipop, los certificados se enumeran allí.
Estoy utilizando okhttp3 como biblioteca HTTP.
Alguna idea de lo que estoy haciendo mal?
- ¿Cómo enviar solicitudes de proxy a api.twitter.com incluyendo certificados SSL?
- SSL Handshake no se puede conectar a Google desde un cliente Android
- ¿Qué usamos para la configuración de seguridad de red de Android N para un certificado auto-firmado?
- Autenticación de cliente SSL en Android 4.x
- Volley NoConnectionError: tlsv1 alert fallback inapropiado
- Excepción terminada handshake de https de Android
- Conexión HTTPS con certificado de cliente en una aplicación para Android
- Generar un certificado de cliente en un dispositivo Android
Basado en el hilo de la solución de problemas de los comentarios para el OP, la respuesta es instalar sólo cert de CA del proxy como de confianza, no su cert + clave privada.
El problema fue causado por dos factores:
-
Instalar no sólo el CERT de CA del proxy MiTM sino también su clave privada (permitiendo así que las aplicaciones VPN en el dispositivo descifren el tráfico de la red MiTM de otras aplicaciones). No necesita la clave privada del proxy MiTM en el dispositivo.
-
Android Nougat cambio en el comportamiento de la
Settings -> Security -> Install from storage
flujo deSettings -> Security -> Install from storage
para los archivos que contienen una clave privada, además de cert (s). Este cambio en el comportamiento desenmascaró la cuestión anterior.
Antes de Nougat, la Settings -> Security -> Install from storage
flujo de Settings -> Security -> Install from storage
para los archivos que contienen una clave privada, además de certs instaló erróneamente los certificados como de confianza para la autenticación del servidor (por ejemplo, HTTPS, TLS, Para que se instalen correctamente como certificados de cliente utilizados para autenticar este dispositivo Android en los servidores. En Nougat, el error fue corregido y estos certs ya no se instalan como confiable para la autenticación del servidor. Esto evita que las credenciales de autenticación de cliente afecten (decaer) la seguridad de las conexiones a los servidores. En su situación, esto evita que su MiTM tenga éxito.
Lo complicado es que la Settings -> Security -> Install from storage
no proporciona una forma explícita para que el usuario especifique si están instalando una credencial de autenticación de cliente (clave privada + cadena cert) o un ancla de confianza de autenticación de servidor CA cert – no necesita clave privada). Como resultado, las Settings -> Security -> Install from storage
flujo de Settings -> Security -> Install from storage
adivinan si se trata de credenciales de autenticación de cliente / usuario o de confianza de autenticación de servidor, suponiendo que si se especifica una clave privada, debe ser una credencial de autenticación 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.
PS Con respecto a su configuración de seguridad de red, probablemente debería configurar la aplicación para que también confíe en anclajes de confianza de "sistema" en el modo de depuración (sección sobre depuració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 CA cert esté instalado como confiable en el dispositivo Android.
La solución es no utilizar .p12 , sólo navegar con Chrome (con proxy configurado en wifi) a http://charlesproxy.com/getssl e instalar el archivo .pem descargado .
Tenía exactamente el mismo problema en mi Nexus 5X con Android 7.0. Anteriormente se exportó .p12 desde Charles 3.11.5 (Ayuda-> Proxy SSL-> Exportar certificado raíz Charles y clave privada). Cuando intenté instalar .p12 desde el teléfono (Configuración-> Seguridad-> Instalar desde el almacenamiento) aparece sólo en "Credenciales de usuario" y nunca en "Credenciales de confianza", y por supuesto SSL con Charles proxy no funcionó.
El total "how-to" para Android 7.0 sería así:
- Configurar WiFi + proxy (como Charles lo requiere). Conéctelo.
- En el dispositivo, navega con Chrome a http://charlesproxy.com/getssl , acepta la solicitud para descargar .pem, luego presiona "open", se inicia la aplicación "Certificate installer". Utilícelo para instalar el certificado como "VPN y aplicaciones".
- Poner el atributo
android:networkSecurityConfig="@xml/network_security_config"
en<application>
en Manifest.xml - Cree res / xml / network_security_config.xml con el contenido de la primera publicación (es totalmente correcto).
- Lanzar Charles y la aplicación y divertirse.
PS Verifique la fecha y la hora en el dispositivo. Debe ser correcto.
Escribí un script que inyectaba el apk con las excepciones requeridas y permitía usar Charles Proxy con la aplicación.
Este es el Github https://github.com/levyitay/AddSecurityExceptionAndroid
Estoy en Android 7.1.1, aquí es cómo me instalo en mi dispositivo (OnePlus One) – sin el cambio de manifiesto (estaba apuntando 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 da el IP de proxy y número de puerto y también el enlace a donde debe descargar charles proxy SSL.
En tu teléfono:
-
Wifi Settings > Modify Network > Advanced Options
. Establezca Proxy comoManual
e introduzca el número de IP y Puerto que recibió de Charles en elProxy hostname
Proxy port
y elProxy port
respectivamente. -
(OPCIONAL) Puede o no puede acceder al vínculo chls.pro/ssl proporcionado por Charles anteriormente. En mi dispositivo, siempre me notificaron que no tenía conexión de red. He añadido charlesproxy.com al
Bypass proxy for
campo. -
En su navegador, vaya al enlace en el paso 3 y descargue cualquier certificado necesario (si no funciona en Chrome, descargue Dolphin Browser). Puede nombrar su certificado con cualquier nombre.
De vuelta en Charles Proxy:
- Debe obtener el mensaje para
Allow
oDeny
su teléfono para usar el proxy si la configuración predeterminada le pide conexiones remotas.
Ahora puede usar Charles on Nougat 7.1.1.
- Google Maps Android API v2 – detectar el toque en el mapa
- ¿Cómo puedo analizar puntos y trazar una ruta en un mapa de Google en Android?