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?
- Certificados WebView y SSL
- Crear SSL-Socket en Android con certificado autofirmado
- Generación e instalación de certificados SSL
- Android: evitar el olfateo (por ejemplo, con CharlesProxy) de tráfico SSL
- Error de Android en webview.loadUrl () - Ancla de confianza para la ruta de certificación no encontrada
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.
- los medios de comunicación subiendo a la nube utilizando url interup firmado debido a algunos problemas de certificado ssl?
- Certificado particular de confianza solamente emitido por CA - Android
- Google Cloud Messaging muestra "notRegistered" al usar la aplicación distribuida de iOS
- Consumir servicio WCF en SSL en Android
- Android WebView setCertificate emite problemas de SSL
- Necesitan ayuda para entender las cadenas de certificados
- Conexión TLS de Android y certificado auto-firmado
- Cómo importar certificado SSL autofirmado a Volley en Android 4.1+
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).
- Eficiencia de getDrawable (): ¿es el Drawable almacenado en caché por el framework?
- Android – Eliminar Spinner Dropdown Arrow