¿Cómo habilitar la depuración de SSL en la plataforma Android?
¿Hay algo similar a establecer -D javax.net.debug=ssl
en la línea de comandos para aplicaciones de escritorio Java, pero para Android? He intentado System.setProperty("javax.net.debug", "ssl");
en código vía System.setProperty("javax.net.debug", "ssl");
Pero eso no funcionó.
Si no hay una forma de habilitar esta propiedad, ¿hay al menos otra manera de depurar el lado del cliente de una conexión SSL?
- Android No se puede verificar el certificado autofirmado sin una conexión previa a Internet
- ¿Cómo hacer un HTTPS POST de Android?
- Cómo hacer la reanudación de sesión SSL en Android
- Pinzado de certificado SSL con Picasso
- Dónde encontrar el usuario instalado certificado android 4.0 y superior
EDIT: Sólo para aclarar, esto se refiere a sockets SSL crudo (SSLSocket y SSLSocketFactory), no la biblioteca Apache o cualquier otra biblioteca de red.
- SSLHandshakeException: Handshake falló en Android N / 7.0
- Cordova "release" se comporta de forma diferente a "debug" con respecto a SSL
- Error SSL de Android: certificado no de confianza ... a veces
- Uso de UnboundID SDK con un archivo de certificado SSL para conectarse al servidor LDAP en la aplicación de Android
- Cómo configurar los certificados SSL con Charles Web Proxy y el último emulador de Android en Windows?
- Android: evitar el olfateo (por ejemplo, con CharlesProxy) de tráfico SSL
- Certificados WebView y SSL
- Javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Ancla de confianza para la ruta de certificación no encontrada
En este punto, simplemente no parece ser una manera de hacer esto. Pero en cualquier caso, estamos cambiando a la biblioteca de Netty pronto que tiene capacidades de registro más detalladas incorporar.
Así que la solución (no genial) a este problema es simplemente no usar SSLSocket, sino usar una mejor biblioteca de red en su lugar.
Puede escribir una clase TrustManager para manejarla. Ejemplo:
ClientConnectionManager cm = new BasicClientConnectionManager(); cm.getSchemeRegistry().register(createHttpsScheme()); DefaultHttpClient client = new DefaultHttpClient(cm); String url = "https://your domain/your url"; HttpGet get = new HttpGet(url); HttpResponse resp = client.execute(get); etc.. public static Scheme createHttpsScheme() { SSLContext context = SSLContext.getInstance("TLS"); context.init(null, new TrustManager[] { new TestTrustManager() }, new SecureRandom()); SSLSocketFactory sf = new SSLSocketFactory(context); return new Scheme("https", 443, sf); }
Int TestTrustManager.java puede imprimir la cadena de esta manera:
public class TestTrustManager implements X509TrustManager { @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { for (int i = 0; i < chain.length; ++i) { System.out.println(chain[i]); } decorated.checkServerTrusted(chain, authType); } }
Si está utilizando Apache HttpClient (importando un archivo jar), puede habilitar el registro estableciendo variables ambientales en Eclipse. Si usa Commons Logging, los registros se imprimen en la consola. Sin embargo esto sólo funciona si está ejecutando su aplicación en el emulador y no en el dispositivo. No está seguro de esto ayuda.
Ver http://hc.apache.org/httpcomponents-client-ga/logging.html
He encontrado una ayuda útil de la depuración es escribir un envoltorio alrededor de X509KeyManager y de X509TrustManager que delega llamadas a la puesta en práctica original mientras que registra los resultados, por ejemplo:
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(ks); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(ks, null); TrustManager[] tms = WrapTrustManager.WrapArray(tmf.getTrustManagers()); KeyManager[] kms = WrapKeyManager.WrapArray(kmf.getKeyManagers()); SSLContext context = SSLContext.getInstance("TLS"); context.init(kms, tms, null); ....setSocketFactory(context.getSocketFactory());
La implementación de WrapTrustManager y WrapKeyManager son bastante sencillos, pero se les advierte que usan excepciones para indicar fallas y por lo tanto es importante no tragar excepciones mientras registra el resultado.
Tenga en cuenta que la interfaz utiliza las interfaces de KeyManager y TrustManager vacías, y es necesario actualizarlas dinámicamente a X509KeyManager y X509TrustManager.
- Generación e instalación de certificados SSL
- El acceso al Dex ahora es imposible, comenzando con 1.4.0