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

101

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.

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 funcionando en modo de depuración. Pero pase lo que pase, lo consigo javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found..

No hace falta decir que instalé un pfxcertificado de Settings -> Security -> Install from storage. El certificado se muestra en User Credentialspero no en Trusted credentials -> User. En mi dispositivo de paleta, los certificados se enumeran allí.

Estoy usando okhttp3 como biblioteca HTTP.

¿Alguna idea de lo que estoy haciendo mal?

mbonnin
fuente
1
Como prueba rápida, intente agregar / mover el useruno al <base-config>y vea si eso cambia importa. No debería, pero solo te llevará un momento intentarlo.
CommonsWare
¿No necesitaría agregar la CA explícita para Charles en developer.android.com/training/articles/security-config.html : 'Confiar en CA adicionales' ya que Charles CA es una autogenerada y no estaría en el ¿Cadena de confianza del sistema Android?
Morrison Chang
@Morisson Chang: No quiero incrustar Charles CA en la aplicación, quiero poder agregarlo manualmente en mi teléfono de desarrollo como solía hacer. DesdeSettings -> Security -> Install from storage
mbonnin
1. ¿Cómo está haciendo referencia a network_security_config.xml en el archivo AndroidManifest.xml de su aplicación? 2. ¿Podría vincular el archivo .pfx? Supongo que contiene solo el certificado de CA (sin claves privadas) y, por lo tanto, debería estar bien para publicar. Lo pregunto porque, si el .pfx contiene una clave privada, se asumirá que es un archivo de certificado de cliente y, por lo tanto, la CA del archivo no se instalará como confiable para la autenticación del servidor.
Alex Klyubin
1
@AlexKlyubin hurra, ya está funcionando :). Supongo que necesitaba reiniciar mi aplicación o charles o cualquier otra cosa. Estaba confundido porque instalé el mismo archivo .pfx en innumerables dispositivos Android antes del turrón y se reconocieron bien. Pero todo está bien ahora. ¿Podría escribir una respuesta para que pueda aprobarla?
mbonnin

Respuestas:

26

Según el hilo de comentarios de solución de problemas para el OP, la respuesta es instalar solo el certificado CA del proxy como confiable, no su certificado + clave privada.

El problema fue causado por dos factores:

  1. Instalar no solo el certificado CA del proxy MiTM, sino también su clave privada (lo que permite 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. Android Nougat cambia el comportamiento del Settings -> Security -> Install from storageflujo para archivos que contienen una clave privada además de los certificados. Este cambio de comportamiento desenmascaró el problema anterior.

Antes de Nougat, el Settings -> Security -> Install from storageflujo de archivos que contienen una clave privada además de los certificados instaló erróneamente los certificados como confiables para la autenticación del servidor (por ejemplo, HTTPS, TLS, lo que hace que su MiTM tenga éxito), además de estar correctamente instalados como certificados de cliente utilizados para autenticar este dispositivo Android en los servidores. En Nougat, el error se corrigió 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 Settings -> Security -> Install from storageno proporciona una forma explícita para que el usuario especifique si está instalando una credencial de autenticación de cliente (clave privada + cadena de certificados) o un ancla de confianza de autenticación de servidor (solo un certificado de CA, no se necesita clave privada) . Como resultado, el Settings -> Security -> Install from storageflujo adivina si se trata de una credencial de autenticación de cliente / usuario o 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.

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 el modo de depuración (sección de depuración-anulaciones). De lo contrario, las compilaciones de depuración de la aplicación no funcionarán a menos que las conexiones las realice un proxy cuyo certificado CA esté instalado como confiable en el dispositivo Android.

Alex Klyubin
fuente
1
Respecto al PS: dice la documentación Trust anchors specified in debug-overrides are added to all other configurations. Entonces, ¿tenía la impresión de que se agregó a 'base-config' y no lo reemplazó por completo?
mbonnin
Oh, tienes razón. No es necesario que enumere explícitamente los anclajes de confianza del "sistema" en las anulaciones de depuración.
Alex Klyubin
4
Esta respuesta no está clara. Consulte la respuesta de @ stkent a continuación.
Adam Hurwitz
4
De acuerdo, esta respuesta explica lo que está sucediendo, pero no está muy claro qué pasos se deben seguir.
StarWind0
114

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

Tuve exactamente el mismo problema en mi Nexus 5X con Android 7.0. Anteriormente se exportó .p12 de Charles 3.11.5 (Ayuda-> Proxying 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 solo en "Credenciales de usuario" y nunca en "Credenciales confiables" y, por supuesto, SSL con el proxy Charles no funcionó.

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

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

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

Alexander Skvortsov
fuente
2
Una nota importante sobre esta gran respuesta: si su aplicación está dirigida a API 23 o inferior, no necesita los pasos 3 y 4. De hecho, no podrá compilar el material de configuración de seguridad de red si tiene API 23 o bajo.
David Ferrand
1
Esta es una gran solución para Android 7.0. Mucho más claro que la información oficial de Charles Proxy.
Adam Link
3
Probablemente solo yo, pero estos pasos ya no me funcionan en 7.1.1. Recientemente hice una actualización
satyajit
@satyajit Esta solución me funciona en Android 7.1.1 en un Google Pixel.
Dick Lucas
con o sin los pasos 3 y 4?
Satyajit
-1

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. Estos pasos le brindan la IP del proxy y el número de puerto y también el enlace al lugar donde debe descargar Charles Proxy SSL.

En tu teléfono:

  1. Wifi Settings > Modify Network > Advanced Options. Configure Proxy Manuale ingrese la IP y el número de puerto que recibió de Charles en Proxy hostnamey Proxy portrespectivamente.

  2. (OPCIONAL) Es posible que pueda o no acceder al enlace chls.pro/ssl proporcionado por Charles anteriormente. En mi dispositivo, siempre me notificaron que no tenía conexión de red. Agregué charlesproxy.com al Bypass proxy forcampo.

  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 el nombre que sea.

De vuelta en Charles Proxy:

  1. Debería recibir el mensaje para que su teléfono Allowo Denysu teléfono utilicen el proxy si su configuración está predeterminada para solicitarle conexiones remotas.

Ahora puede usar Charles en Nougat 7.1.1.

Tiffany
fuente