Tengo un problema muy extraño con mi teléfono (Alcatel 997D con Android 4.0.4). Permítanme empezar por el principio. Proporciono ciertos servicios (principalmente cosas de sincronización, Firefox y Cal/CardDAV) en un servidor con claves SSL autofirmadas que está en mi red doméstica. Para proporcionar conectividad, hice un pequeño agujero en el firewall de mi router y tengo un dominio registrado que se ajusta a mi dirección IP WAN regularmente.
Todo funcionaba bien hace algún tiempo (6 meses, creo). Pero ahora mi teléfono no puede conectarse a mi servidor cuando utiliza la conexión 3G (con todas las aplicaciones de sincronización, Firefox, aplicaciones de sincronización Cal/CardDAV, Firefox con mi IP WAN como dirección), pero todo funciona bien cuando me conecto a través de la WLAN local.
Básicamente, lo único que he cambiado son las claves SSL de mi servidor, y quizás he instalado algunas pequeñas actualizaciones de Android en el teléfono. Para descartar que sea un problema de la red 3G, hice otro agujero en el firewall de mi router y envié el tráfico a uno de mis otros ordenadores (mostrando una pequeña página web por http). Para mi asombro, el teléfono pudo conectarse a la página a través de 3G.
Esto es muy inquietante. Para descartar que el teléfono sea el problema, todavía tengo que comprobar la conectividad 3G en otra máquina, e intentar conectarme a mi servidor a través de una WLAN extranjera. Pero por si acaso: ¿Cómo puedo obtener más información en el lado de Android? Todas las aplicaciones proporcionan una salida más o menos sin sentido.
Buscando en Google, descubrí que hay más opciones disponibles para la depuración, como la instalación de curl. Voy a hacer esto, pero hacer esta pregunta de todos modos con la esperanza de que alguien ha visto algo similar, o me puede apuntar a un error trivial de mi lado.
Hay errores en el registro del sistema que indican problemas de handshake SSL en la conexión 3G. Aquí hay algunas entradas de registro:
[ 08-24 12:30:02.508 19763:0x4d6c E/NativeCrypto ]
Unknown error during handshake
[ 08-24 12:30:08.274 19763:0x4d6c E/NativeCrypto ]
Unknown error during handshake
[ 08-24 12:30:08.275 19763:0x4d6c W/System.err ]
javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x18e8508: Failure in SSL library, usually a protocol error
[ 08-24 12:30:08.275 19763:0x4d6c W/System.err ]
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:683 0x4027f522:0x00000000)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:460)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:257)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:210)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:486)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:450)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:194)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
at libcore.net.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:280)
[…]
Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x18e8508: Failure in SSL library, usually a protocol error
[ 08-24 12:30:08.277 19763:0x4d6c W/System.err ]
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:683 0x4027f522:0x00000000)
[ 08-24 12:30:08.278 19763:0x4d6c W/System.err ]
at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)
[ 08-24 12:30:08.278 19763:0x4d6c W/System.err ]
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:410)
[ 08-24 12:30:08.278 19763:0x4d6c W/System.err ]
La conexión a otras páginas SSL, por ejemplo, los complementos de Mozilla, funciona con 3G. Así que supongo que hay algo en mis claves SSL que no le gusta a la telco o a Android. Haré algunas pruebas con otros dispositivos y claves.
Probé la red 3G de mi proveedor con un módem USB móvil conectado a mi Mac, y todo funcionaba, calendario, agenda, etc. (desactivé Ethernet y WLAN en el Mac, y la aplicación proporcionada por la telco mostraba un rendimiento de 1 MB, y todo era un poco lento). Creo que eso demuestra que Android tiene algo que ver con este lío.
Vale, algo que se me acaba de ocurrir: Tenía una aplicación utilizada para la sincronización de calendarios que ya no podía sincronizar a través de WLAN después del cambio de certificado SSL. Lanzaba una excepción que se quejaba de una extensión crítica no soportada o desconocida. Creo que esa es la clave para resolver el problema.
Cambié el certificado de mi servidor y dejé que Android confiara en la CA, ahora no tengo problemas con los certificados no confirmados a través de la WLAN, sin embargo, el problema del 3G permanece. He desenterrado este sobre
SSL23_GET_SERVER_HELLO:unknown protocol
Según esto, el error:140770FC Lo que tengo apuntaría a un problema de DNS, lo que explicaría por qué ocurre sólo en 3G, pero no por qué no ocurre en el Mac.
Para obtener un poco más de información, he intentado abrir una de mis páginas web con Chrome. Se emitió un
Error 111 (net::ERR_TUNNEL_CONNECTION_FAILED)
que estaba relacionado con problemas de SSL aquí pero no puedo reconocer que el error desaparece después de un cambio al puerto estándar. Necesito mejores herramientas para seguir investigando, tal vez haga otra pregunta más adelante.
0 votos
El último bloque da algunas pistas:
SSL handshake aborted: ssl=0x18e8508: Failure in SSL library, usually a protocol error
yroutines:SSL23_GET_SERVER_HELLO:unknown protocol
Lo que confirma que su problema radica en la parte SSL. Es extraño que esto no ocurra en WiFi. ¿Tienes la posibilidad de probar con otro proveedor de 3G? Como no sucede en WiFi, debe ser algo en su extremo. También: ¿Se te presenta un certificado? Si es así, yo lo miraría más de cerca y lo compararía con lo que se espera aquí.0 votos
@Izzy Lamentablemente, no llego ni siquiera a la etapa del certificado en Firefox, no se establece ninguna conexión en absoluto cuando se utiliza 3G. Hago algunas otras pruebas en los próximos días, y actualizar mi pregunta de acuerdo a mis hallazgos.
0 votos
Me viene a la mente: ¿Podría ser algún problema de "mapeo de puertos" en el NAT de tu proveedor? Quizás tus experimentos deberían incluir la vinculación de servicios a un puerto diferente. Utilizar una SIM diferente (mejor de otro proveedor) también podría dar resultados interesantes. Ya que ni siquiera llegas a la "etapa del certificado": ¿Has comprobado los registros de tus servidores, si hay alguna petición entrante? También pueden revelar detalles útiles.
1 votos
@Izzy He probado la red 3G de mi proveedor con un módem USB móvil conectado a mi Mac, y todo funcionaba, calendario, libreta de direcciones, etc (desactivé Ethernet y WLAN en el Mac, y la aplicación de la telco mostraba un rendimiento de 1 MB, y todo iba un poco lento). Creo que eso demuestra que Android tiene algo que ver con este lío. Compruebo los registros de mi servidor con fuerza, tal vez haya un NAT involucrado.