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:
- Javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Ancla de confianza para la ruta de certificación no encontrada
- Certificado de fijación en Android
- Ejemplo de servicio Apache Thrift que utiliza HTTPS, en Python
- Vimeo error de SSL con Retrofit en Android
- OKhttp: SSLProtocolException: Protocolo de enlace SSL finalizado
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!
- Si utilizo SSLSocket en Android y código duro, la contraseña del truststore en el código fuente es insegura?
- OkHttp certificado de confianza
- Tablet no puede descargar el archivo .apk en algunos navegadores
- Ahora que SSLSocketFactory está obsoleto en Android, ¿cuál sería la mejor manera de manejar la autenticación de certificados de cliente?
- OkHttp con pinzado de certificado
- Cómo hacer la reanudación de sesión SSL en Android
- Comprobación de que el mensaje provenía de un punto específico de aplicación / punto final
- Consumir servicio WCF en SSL en Android
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