2011-03-30 18 views
5

En la aplicación en la que estoy trabajando, tengo que hacer una conexión HTTPS a un servidor web. Obtuve errores de certificados no confiables y, después de consultar con stackoverflow, encontré esta publicación en el blog: http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/Error de Android SSL: certificado no confiable ... a veces

Parece que la CA de este servidor no está incluida en la tienda predeterminada de Android. En pocas palabras, descargué todos los certificados, creé un almacén de claves con el proveedor de BKS, importé las claves, importé el almacén de claves en mi proyecto, subclasé la clase DefaultHttpClient para forzarlo a utilizar mi almacén de claves.

Después de seguir los pasos en el blog, funcionó perfectamente en el emulador. Sin embargo, cuando lo pruebo en un dispositivo, falla intermitentemente. Creo que he aislado un patrón. Parece que después de que haya pasado un tiempo y trato de hacer una conexión HTTPS, fallará. Entonces, si intento la misma conexión nuevamente, tendrá éxito. Si espero un poco y luego vuelvo a intentarlo, falla la primera vez y tiene éxito en intentos repetidos. Probablemente pueda solucionarlo haciendo múltiples intentos de falla, pero me gustaría saber qué está pasando. El comportamiento sugiere algún tipo de caché, pero no sé cómo encontrarlo o modificar su comportamiento. ¿Alguien tiene alguna sugerencia sobre lo que está pasando o sabe lo que estoy haciendo mal? Cualquier ayuda sería apreciada.

Respuesta

4

He resuelto un problema similar al establecer

System.setProperty("http.keepAlive", "false"); 

antes que yo mis llamadas HTTP. Parece que hay un problema con Android: mantener conexiones cerradas en su grupo de conexiones e intentar reutilizarlas.

0

Puede "omitir" los certificados. Sí, perderá seguridad pero a veces es la única solución ...

Para hacerlo. En primer lugar, declarar una TrustManager:

private TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() 
    { 
     public java.security.cert.X509Certificate[] getAcceptedIssuers() 
     { 
      return null; 
     } 

     public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) 
     { 

     } 

     public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) 
     { 

     } 
    } 
}; 

En segundo lugar, cambiar el contexto SSL:

  SSLContext sc = SSLContext.getInstance("TLS"); 
      sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
      HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 

espero que ayude.

+1

Finalmente decidí poner el intento de conexión en un ciclo que se repite tres veces. Hasta ahora siempre funciona en el segundo intento. Hacky, pero todavía consigo usar el certificado. Aún no sé lo que está pasando. – d370urn3ur

+0

¡funciona bien para mí! –

+1

Si acepta todos los certs, advierta al usuario. Es su derecho saber que estás pasando por alto la seguridad. – Krylez

Cuestiones relacionadas