2010-05-24 15 views
38

Para mi aplicación, Transdroid, me estoy conectando a servidores remotos a través de HTTP y opcionalmente de manera segura a través de HTTPS. Para estas conexiones HTTPS con HttpClient, estoy usando una implementación de fábrica de sockets SSL personalizada para asegurarme de que los certificados autofirmados funcionen. Básicamente, acepto todo e ignoro cada comprobación de cualquier certificado.El manejo personalizado de SSL dejó de funcionar en Android 2.2 FroYo

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

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

Así es como puedo inicializar 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); 

que hacen uso de un FakeSocketFactory y FakeTrustManager, de los cuales la fuente se puede encontrar here .

Una vez más, no entiendo por qué de repente se detuvo el trabajo, o incluso lo que significa el error 'Pipa rota'. He visto mensajes en Twitter de que Seesmic y Twidroid fallan con SSL habilitado en FroYo también, pero no estoy seguro de si está relacionado.

¡Gracias por cualquier instrucción/ayuda!

Respuesta

40

Aquí está la respuesta, con muchas, muchas gracias a un desarrollador Seesmic útiles dispuesto a compartir la revisión:

En la fábrica de sockets costumbre, la creación de socket (con createSocket) aparentemente ha sido cambiado específicamente para el SSLSocketFactory implementación. Por lo que la antigua:

@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 se volvió a funcionar para mí!

ACTUALIZACIÓN: Como esta sigue siendo una respuesta popular, déjame actualizar mi enlace al código de trabajo. This SSl-enabled socket factory que soportan protocolos modernos (TLS 1.1+), SNI y, opcionalmente, permite accept all certificates (inseguro, ignora todos los certificados SSL) o un self-signed certificates (por hash SHA-1).

+0

que estaba teniendo el mismo problema. Muchas gracias por esta solución rápida y fácil. –

+0

Esta solución no resuelve el problema para mí por sí mismo - me encontré con que tenía que aumentar también la prioridad del hilo en el que se está estableciendo la conexión de socket a THREAD_PRIORITY_URGENT_AUDIO (seguido por el establecimiento de la prioridad de nuevo a THREAD_PRIORITY_MORE_FAVORABLE vez que la conexión ha sido establecido). En este caso específico, sospecho que una animación estaba usando demasiada CPU :-( – tonys

+0

, ¿cómo lo haces? – Mikey

1

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

+0

Específicamente, mira el comentario # 17:?. http://code.google.com/p/android/issues/detail?id=10807#c17 Esto me ayudó en gran medida al obtener una aplicación para Android Listo. – Andrew

Cuestiones relacionadas