El ancla de la confianza para la trayectoria del certificado no encontrada al usar sobre 3g pero trabaja muy bien sobre WiFi

Mi proyecto androide está usando api 15. Estoy conectando a un servidor a través de https usando la clase HttpsURLConnection. Todo funciona bien sobre WiFi, pero si apago WiFi y ejecutar más de 3g me sale lo siguiente:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:413) at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:257) at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:210) at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:477) at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:432) at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80) at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188) at libcore.net.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:280) 

Si estoy haciendo algo mal, ¿por qué funcionaría con WiFi?

Un poco más de información aquí.

Si utilizo openssl para ver la información del certificado del servidor,

 echo | openssl s_client -connect myserver.com:443 

Devuelve un cert auto-firmado en el nivel del servidor, mientras que

 echo | openssl s_client -connect myserver.com:443 -servername myserver.com 

Devuelve el certificado 'correcto'. Tengo varios vhosts en mi servidor, cada uno con su propio cero rapidssl-emitido así que "pienso" que significa que necesito utilizar un cliente TLS-permitido. Al menos esa es mi interpretación del mensaje que veo en mi inicio de sesión de Apache en inicio:

 Name-based SSL virtual hosts only work for clients with TLS server name indication support 

Si estoy correcto hasta ahora, ¿significa eso que mi red 3g móvil podría estar atornillando con el TLS o hay algo más que debería estar haciendo?

Puedo hacer que las cosas funcionen más de 3g subclasificando DefaultHttpClient e importando un almacén de claves que contiene los servidores autenticados cert pero que definitivamente no es mi opción preferida.

La opción Adding -servername simplemente establece el campo Server Name Indication del Server Name Indication en el mensaje de Client Hello que nos ayuda a seleccionar el certificado correcto si el host de destino contiene muchos, como en su caso. Sin embargo, no está relacionado con el problema.

Durante el apretón de manos SSL, los certificados se entregan en pares sujeto / emisor, formando una cadena de certificados.

Es decir, la cadena de certificados google.com ve así:

 openssl s_client -connect google.com:443 CONNECTED(00000003) depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA verify error:num=20:unable to get local issuer certificate verify return:0 --- Certificate chain 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com i:/C=US/O=Google Inc/CN=Google Internet Authority G2 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2 i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority --- 

Una vez recibido, el cliente intenta validar todos los emisores en la cadena de abajo hacia arriba (raíz). Si el cliente no pudo validar el certificado raíz, aparece el mensaje Trust anchor for certification path not found .

Por lo tanto, de nuevo a la cuestión WiFi / 3G, probablemente el DNS de su red móvil no pudo resolver la dirección de uno de los emisores intermedios de su cadena de certificados.

ACTUALIZAR:

Puede poner sus certificados de TrustManager en su APK y agregar a través de TrustManager en su código. Este enfoque puede superar las restricciones de la red de acceso (si las hay).

  • Primera autentificación para obtener el token
  • Error de libcurl CURLE_SSL_CACERT_BADFILE en android
  • La conexión TLS que usa SSLSocket es lenta en el sistema operativo Android
  • ¿Debemos usar el proveedor de seguridad de google con OkHttp?
  • SSLSocketFactory establecimiento de tiempo de espera y propiedades de socket
  • Error de SSL SSL HttpGet (sin certificado par) Error OR (Conexión cerrada por peer)
  • Android Studio / Intellij, Gradle Error: Causa: no homologado
  • ¿Deshabilitar la validación del certificado SSL de la conexión HTTPS?
  • Cómo agregar un certificado pkcs12 de cliente a Postman Chrome, W7?
  • Autenticación SSL de dos vías en android
  • ¿Por qué vuelve Volley a SSLV3?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.