type studio seguridad not mega found for failed error err_bad_ssl_client_auth_cert enabled check certpathvalidatorexception certification java android ssl

java - studio - ssl android error



¿Cómo habilitar la depuración SSL en la plataforma Android? (4)

¿Hay algo similar a configurar -D javax.net.debug=ssl en la línea de comandos para las aplicaciones de escritorio de Java, pero para Android? He intentado configurarlo en el código a través de System.setProperty("javax.net.debug", "ssl"); pero eso no funcionó.

Si no hay una manera de habilitar esta propiedad, ¿hay al menos otra forma de depurar el lado del cliente de una conexión SSL?

EDITAR: Solo para aclarar, esto se refiere a sockets SSL sin formato (SSLSocket y SSLSocketFactory), no a la biblioteca de Apache o cualquier otra biblioteca de red.


En este punto, parece que no hay una manera de hacer esto. Pero en cualquier caso, pronto nos cambiaremos a la biblioteca Netty, que tiene incorporadas capacidades de registro más detalladas.

Por lo tanto, la solución (no excelente) para este problema es simplemente no usar SSLSocket, sino usar una mejor biblioteca de red.


He encontrado que una ayuda útil para la depuración es escribir un contenedor alrededor de X509KeyManager y X509TrustManager que delega las llamadas a la implementación original mientras se registran 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 sencillas, pero se debe tener en cuenta que usan excepciones para indicar fallas y, por lo tanto, es importante no tragar las excepciones mientras se registra el resultado.

Tenga en cuenta que la interfaz utiliza las interfaces vacías de KeyManager y TrustManager, y necesita reenviarlas dinámicamente a X509KeyManager y X509TrustManager.


Puedes escribir una clase de TrustManager para manejarlo. 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 (al importar un archivo jar), puede habilitar el registro configurando variables de entorno en Eclipse. Si utiliza Commons Logging, los registros se imprimen en la Consola. Sin embargo, esto solo funciona si está ejecutando su aplicación en el emulador y no en el dispositivo. No estoy seguro de esto ayuda.

Consulte http://hc.apache.org/httpcomponents-client-ga/logging.html