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:
- Android: conexión HTTPS (SSL) mediante HttpsURLConnection
- Android Google Play Advertencia: Vulnerabilidad de procesador de errores SSL
- Confiando en todos los certificados con okHttp
- El certificado SSL no es de confianza - sólo en dispositivos móviles
- Excepción terminada handshake de https de Android
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!
- Javax.net.ssl.SSLPeerUnverifiedException: Ningún certificado igual mientras intentaba conectarse usando https con .bks keystore
- javax.net.ssl.SSLPeerUnverifiedException: Nombre de host no verificado:
- Android 4.4.2 Protocolo SSL abortado
- ¿Cómo conectar un socket SSL a través de un proxy HTTP?
- ¿Cómo se puede cargar https url sin el uso de ssl en android webview
- Error de lectura: error en la biblioteca SSL, generalmente un error de protocolo
- La conexión TLS que usa SSLSocket es lenta en el sistema operativo Android
- SSL Broken Pipe
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
- ¿Cómo almacenar de forma segura las credenciales (contraseña) en la aplicación de Android?
- Restablecer Android textview maxlines