2010-10-31 12 views
15

¿Hay algo similar a la configuración -D javax.net.debug=ssl en la línea de comandos para aplicaciones de escritorio Java, pero para Android? Intenté configurarlo en el código a través del System.setProperty("javax.net.debug", "ssl"); pero eso no funcionó.¿Cómo habilitar la depuración de SSL en la plataforma Android?

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?

EDIT: Solo para aclarar, esto se refiere a sockets SSL sin procesar (SSLSocket y SSLSocketFactory), no a la biblioteca de Apache ni a ninguna otra biblioteca de red.

+0

También me gustaría saberlo, pero no pude encontrar ninguna pista al respecto. : S – gnclmorais

Respuesta

1

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

Así que la (no excelente) solución a este problema es simplemente no usar SSLSocket, sino usar una red mejor biblioteca en su lugar.

+1

Si aparece alguien que haya encontrado una forma de habilitar la depuración de handshake para SSLSocket, por favor agregue su respuesta y yo aceptaré la suya. –

0

Si está utilizando Apache HttpClient (mediante la importación de un archivo jar), puede habilitar el registro configurando variables de entorno en Eclipse. Si usa 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.

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

+0

Lo siento, debería haber sido más claro, no estoy usando la biblioteca Apache, esto es con sockets SSL sin procesar. En el escritorio de Java es muy sencillo realizar la depuración en el protocolo de enlace SSL, pero en Android parece imposible. –

1

puede escribir una clase 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 la siguiente 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); 
    } 
} 
0

he encontrado una ayuda para la depuración útil es escribir una envoltura alrededor de X509KeyManager y X509TrustManager que los delegados a la llama 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 pret Es sencillo, pero se advierte que usan excepciones para indicar fallas, por lo que es importante no tragarse las excepciones al registrar el resultado.

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

Cuestiones relacionadas