Cordova "release" se comporta de forma diferente a "debug" con respecto a SSL

Tengo un problema muy difícil y totalmente ungoogleable con Córdoba.

Un programa, trabajando perfectamente siendo compilado en --debug mode, deja de funcionar después de la compilación en --release mode. Me aseguré de que la fuente es idéntica, y el efecto es constante.

La única diferencia entre --debug build y --release build es que la --release no puede abrir ninguna conexión SSL .

Este problema se localiza muy estrecho, en mi caso es la siguiente línea:

 Socket = new WebSocket('wss://376.su/'); 

Un amigo mío ha informado de la misma ocurrencia de error en la línea:

 <img src="https://blabla" />; 

UPD: el problema se resuelve ver las respuestas.

Problema

He identificado la fuente exacta del problema y he encontrado la solución perfecta. Resultó ser una superposición de dos cuestiones separadas cada una de las cuales es seriamente engañosa:

  1. Mi certificado SSL de Thawte (a pesar de su costo) no es reconocido por Android 5.1.1 como válido (al ser reconocido por todos los navegadores de escritorio)

  2. La bandera --debug en cordova build simplemente ignora el certificado "errores" (en silencio).

Solución

Vaya al directorio de su proyecto y busque el siguiente archivo:

 platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebViewClient.java 

Busque la definición de método ( onReceivedSslError ) y la condición siguiente:

 (appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0 

Esto es lo que hace que --debug y --release diferentes. Para ignorar los "errores" del certificado se debe ejecutar el siguiente código:

 handler.proceed(); return; 

Este archivo persiste a través del proceso de generación. No olvide ignorar esos cuasi-errores la próxima vez que agregue una plataforma a su proyecto.

El problema está en Android que no reconoce la autoridad de certificación (CA). Es un problema común especialmente con dispositivos antiguos, pero afecta a cada dispositivo cada vez que aparece una nueva CA.

La solución es aprovechar la jerarquía de confianza :

  1. Concat los certificados de la autoridad con su cert.

    De esta forma, enviará primero los certificados de su entidad emisora ​​de certificados para asegurarse de que el dispositivo confía en su entidad emisora antes del certificado de su dominio.

    Si tiene certs separados, este comando de shell hace el truco:

     $ cat authority1.cert authority2.cert authority3.cert your_domain.cert >> your_domain_bundle.cert 

    O si tiene un archivo ca-bundle , es una concatenación de certificados, simplemente ejecute:

     $ cat authority.ca-bundle your_domain.cert >> your_domain_bundle.cert 
  2. Agregue your_domain_bundle.cert al servidor.

Problema resuelto para https y wss .

  • Vista web android con certificado de cliente
  • Servicios web de Android con KSOAP2 y HTTPS
  • OkHttp SSL handshake abortado en Android
  • Confiando en todos los certificados con okHttp
  • Soporte para Android SSL - SNI
  • Implementación de TLS 1.2 en Android 2.3.3
  • CertPathValidatorException: Ancla de confianza para ruta de certificación no encontrada
  • Reutilización de la conexión SSL con Android HttpClient
  • Error de certificado no confiable y httpclient en android
  • ¿Por qué vuelve Volley a SSLV3?
  • Cadena de confianza de Android SSL con certificados intermedios (Apache HttpClient 4.X)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.