2012-08-02 16 views
10

Llamo a un servicio REST usando HTTPS en una aplicación de Android. Ya tengo un código de trabajo para esto, pero ahora que estoy usando un servidor recién instalado que aloja el servicio REST, ya no puedo establecer una conexión.Error de protocolo desconocido con conexión HTTPS en android

Aquí es la excepción:

javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x15b7768: Failure in SSL library, usually a protocol error 
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:683 0x402e5cc3:0x00000000) 

La aplicación utiliza las clases de Apache para interactuar con el servicio REST. Recibo este error incluso cuando uso un TrustManager ficticio que acepta cualquier tipo de certificado.

Al llamar al servicio REST desde el Android Navigator, la conexión se establece correctamente y funciona bien.

El teléfono Android ejecuta el último Android 4.0.3 de HTC.

El servicio REST es una aplicación hospedada mod_perl en Apache configurada con soporte SSL.

Navegar por el código fuente de OpenSSL en https://github.com/android/platform_external_openssl/blob/ics-mr0/ssl/s23_clnt.c no me da ninguna pista además de un problema de bajo nivel.

¿Alguna sugerencia de cómo depurar esto aún más?

+0

posible engaño de: http://stackoverflow.com/questions/6735408/apache-commons-net-ssl-handshake-error-with-android – petey

+0

¿Ha comprobado que el nuevo servidor tiene el certificado SSL instalado correctamente? – petey

+1

También conéctese con openssl s_client y vea lo que el servidor está enviando. –

Respuesta

17

Ok, he encontrado cuál es el problema.

Siguiendo la sugerencia de utilizar OpenSSL s_client, me di cuenta de que utilizo un número de puerto incorrecto para la conexión. El nuevo servidor está utilizando el puerto SSL estándar, que no era el caso para el otro servidor que estaba utilizando anteriormente.

Como el servidor no respondía según el protocolo SSL, la respuesta no pudo decodificarse significativamente con OpenSSL y por lo tanto con el Unknown Protocol Error.

Para las personas que quieren saber cómo solía OpenSSL s_client (en su concha hacer):

$ openssl s_client -connect myhost.example.com:443 -tls1 -servername myhost.example.com 

La opción -servername alista Server Name Indication (SNI) para asegurar el servidor proporciona el certificado correcto si hay varios sitios alojados en el servidor. SNI es una opción de TLS 1.0 (y superior), y -tls1_1 y -tls1_2 suelen funcionar también.

A continuación, se muestra una gran cantidad de información sobre la conexión SSL que acaba de abrirse.

+0

Consulte también [¿Qué suites de cifrado habilitar para SSL Socket?] (Http://stackoverflow.com/a/23365536/608639). Java tiene un comportamiento desagradable y oculto en su 'SSLSocketFactory'; y el 'SSLSocketFactoryEx' asegura que los protocolos y las suites de cifrado son" aceptables "(según una definición moderna de" aceptable "). – jww

Cuestiones relacionadas