«Релиз» cordova ведет себя по-разному, чтобы «отлаживать» в отношении SSL

У меня очень сложная и полностью неразрешимая проблема с кордовой.

Программа, прекрасно работающая в режиме --release , перестает работать после компиляции в режиме --release . Я убедился, что источник идентичен, и эффект постоянный.

Единственная разница между сборкой --debug build и --release заключается в том, что --release не может открыть какие-либо SSL-соединения .

Эта проблема локализована очень узкой, в моем случае это следующая строка:

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

Мой друг сообщил о том же ошибке в строке:

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

UPD: проблема решена, см. Ответы.

проблема

Я определил точный источник проблемы, и я нашел идеальное решение. Это оказалось суперпозицией двух отдельных вопросов, каждый из которых серьезно вводит в заблуждение:

  1. Мой SSL-сертификат от Thawte (несмотря на его стоимость) не признан Android 5.1.1 действительным (хотя он распознается всеми настольными браузерами)

  2. Флаг --debug в cordova build просто игнорирует «ошибки» сертификата (молча).

Решение

Перейдите в каталог своего проекта и найдите следующий файл:

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

Найдите определение метода ( onReceivedSslError ) и следующее условие:

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

Это то, что делает --release и --release разными. Чтобы игнорировать «ошибки» сертификата, должен выполняться следующий код:

 handler.proceed(); return; 

Этот файл сохраняется в процессе сборки. Не забывайте игнорировать эти квази-ошибки при следующем добавлении платформы к вашему проекту.

Проблема в Android, которая не распознает центр сертификации (CA). Это распространенная проблема специально для старых устройств, но она влияет на каждое устройство каждый раз, когда появляется новый ЦС.

Решение состоит в том, чтобы воспользоваться доверительной иерархией :

  1. Согласуйте сертификаты властей с сертификатом.

    Таким образом вы сначала отправляете сертификаты своего центра сертификации, чтобы убедиться, что устройство доверяет вашему ЦС перед сертификатом вашего домена.

    Если вы отделили сертификаты, эта команда оболочки выполняет трюк:

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

    Или, если у вас есть файл ca-bundle , то есть конкатенация сертификатов, просто запустите:

     $ cat authority.ca-bundle your_domain.cert >> your_domain_bundle.cert 
  2. Добавьте, что your_domain_bundle.cert на сервер.

Проблема решена для https и wss .