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 pfx
certificado de Settings -> Security -> Install from storage
. El certificado se muestra en User Credentials
pero 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?
fuente
user
uno al<base-config>
y vea si eso cambia importa. No debería, pero solo te llevará un momento intentarlo.Settings -> Security -> Install from storage
Respuestas:
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:
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.
Android Nougat cambia el comportamiento del
Settings -> Security -> Install from storage
flujo 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 storage
flujo 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 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 certificados) o un ancla de confianza de autenticación de servidor (solo un certificado de CA, no se necesita clave privada) . Como resultado, elSettings -> Security -> Install from storage
flujo 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.
fuente
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?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í:
android:networkSecurityConfig="@xml/network_security_config"
de<application>
al Manifest.xmlPS Compruebe la fecha / hora en el dispositivo. Debería ser correcto.
fuente
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
. 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:
Wifi Settings > Modify Network > Advanced Options
. Configure ProxyManual
e ingrese la IP y el número de puerto que recibió de Charles enProxy hostname
yProxy port
respectivamente.(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 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 el nombre que sea.
De vuelta en Charles Proxy:
Allow
oDeny
su teléfono utilicen el proxy si su configuración está predeterminada para solicitarle conexiones remotas.Ahora puede usar Charles en Nougat 7.1.1.
fuente