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

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

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

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

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

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

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

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

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

Ответы

Ответ 1

проблема

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

  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

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

handler.proceed();
return;

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

Ответ 2

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

Возможное решение - воспользоваться иерархией доверия:

  1. Согласуйте полномочия с вашим сертификатом.

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

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

    $ 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.

Ответ 3

У меня была та же проблема, но основным источником является не код SystemWebViewClient.java. Ваш пост очень помог мне найти точный источник. На самом деле основным источником является то, что на сайте https, который вы пытаетесь достичь, отсутствует центр сертификации (CA), который необходим Кордове для подключения к защищенному сайту. На самом деле я использую Сибирскую CMS, которая построена поверх Иона/Кордовы.

Вы можете проверить сайт с помощью https://www.sslshopper.com/ssl-checker.html#hostname=