La manipulación SSL personalizada dejó de funcionar en Android 2.2 FroYo

Para mi aplicación, Transdroid, me estoy conectando a servidores remotos a través de HTTP y opcionalmente de forma segura a través de HTTPS. Para estas conexiones HTTPS con el HttpClient estoy usando una implementación de fábrica de socket SSL personalizada para asegurarse de que los certificados autofirmados están funcionando. Básicamente, acepto todo e ignoro cada comprobación de cualquier certificado.

Esto ha estado funcionando bien desde hace algún tiempo, pero ya no funciona para Android 2.2 FroYo. Al intentar conectarse, devolverá una excepción:

java.io.IOException: SSL handshake failure: I/O error during system call, Broken pipe 

Aquí es cómo inicializo el HttpClient:

  SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("http", new PlainSocketFactory(), 80)); registry.register(new Scheme("https", (trustAll ? new FakeSocketFactory() : SSLSocketFactory.getSocketFactory()), 443)); client = new DefaultHttpClient(new ThreadSafeClientConnManager(httpParams, registry), httpParams); 

Hago uso de un FakeSocketFactory y FakeTrustManager, de los cuales la fuente se puede encontrar aquí .

Una vez más, no entiendo por qué de repente dejó de trabajar, o incluso lo que el error 'Tubo roto' significa. He visto mensajes en Twitter que Seesmic y Twidroid fallan con SSL activado en FroYo también, pero no estoy seguro si está relacionado.

Gracias por cualquier dirección / ayuda!

Esta es la respuesta, con muchas, muchas gracias a un colaborador de Seesmic que está dispuesto a compartir la corrección:

En la fábrica de socket personalizado, la creación de socket (con createSocket ) aparentemente ha cambiado específicamente para la implementación de SSLSocketFactory . Así que el viejo:

  @Override public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { return getSSLContext().getSocketFactory().createSocket(); } 

Necesita ser cambiado a:

  @Override public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { return getSSLContext().getSocketFactory().createSocket(socket, host, port, autoClose); } 

Y luego funcionó de nuevo para mí!

ACTUALIZACIÓN: Como esta sigue siendo una respuesta popular, permítanme actualizar mi enlace al código de trabajo. Esta fábrica de socket habilitada para SSl que admite protocolos modernos (TLS 1.1+), SNI y opcionalmente permite aceptar todos los certificados (inseguro, ignora todos los certificados SSL) o certificados autofirmados (por hash SHA-1).

Más información sobre este problema http://code.google.com/p/android/issues/detail?id=10472 Esto arregló el problema de SSL que teníamos para HTC Desire cuando actualizamos a Android 2.2

  • HTTPS GET (SSL) con Android y certificado de servidor auto-firmado
  • ¿Debemos usar el proveedor de seguridad de google con OkHttp?
  • Android - problemas de SSL en el emulador de estudio de Android, funciona bien en el teléfono
  • Uso de un certificado autofirmado para crear una conexión cliente-servidor segura en android
  • Cómo hacer la reanudación de sesión SSL en Android
  • ¿Cómo anular la lista de cifrado enviada al servidor por Android cuando se utiliza HttpsURLConnection?
  • Android Habilitar TLSv1.2 en OKHttp
  • Cordova "release" se comporta de forma diferente a "debug" con respecto a SSL
  • Linphone Android: Error de apretón de manos de TLS con certificado autofirmado
  • Ejemplo de servicio Apache Thrift que utiliza HTTPS, en Python
  • ¿Cómo usar el SSL auto-firmado en la biblioteca de red de Android (ION)?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.