android ssl android-7.0-nougat

¿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:

  1. 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.

  2. Cambio de Android Nougat en el comportamiento de Settings -> Security -> Install from storage flujo de Settings -> 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.



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:

  1. 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:

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

  2. (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.

  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 cualquier nombre.

De vuelta en Charles Proxy:

  1. Debería recibir el mensaje Allow o Deny 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í:

  1. Configure WiFi + proxy (como Charles lo requiere). Conéctalo.
  2. 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".
  3. Coloque el atributo android:networkSecurityConfig="@xml/network_security_config" en <application> en Manifest.xml
  4. Cree res / xml / network_security_config.xml con contenido de la primera publicación (es totalmente correcto).
  5. Inicie Charles y la aplicación y diviértase.

PD Verifique la fecha / hora en el dispositivo. Debe ser correcto