Лучшее решение для ошибки SSL при сбое рукопожатия в веб-представлении Android без игнорирования ошибок SSL

Я создаю приложение, которое отображает конкретный сайт для пользователя, и использую веб-представление для решения этой задачи. Когда я пытаюсь загрузить этот конкретный сайт, веб-представление ничего не показывает, а кошка говорит:

E / chromium: [ОШИБКА: ssl_client_socket_impl.cc (946)] рукопожатие не удалось; вернул -1, код ошибки SSL 1, net_error -202

Итак, после некоторого поиска я нашел этот ответ, чтобы игнорировать эту ошибку сертификата SSL и с помощью следующего кода я могу загрузить этот сайт .

webView.setWebViewClient(new WebViewClient() {  
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {              
        handler.proceed();
        Log.d("ssl_error", error.toString());                
    }
});

Когда я отправляю error.toString() в журнал кота, он говорит:

основная ошибка: 3 сертификат: выдан: [некоторые сведения о компании этого конкретного сайта] выдан: CN = GeoTrust RSA CA 2018, OU = www.digicert.com, O = DigiCert Inc, C = US; по URL: [конкретный URL-адрес сайта]

Но я хочу исправить эту ошибку, не игнорируя ее.

Как и в ранее упомянутом ответе переполнения стека, я не могу сопоставить детали https://developer.android.com/training/articles/security-config, чтобы решить эту проблему, не игнорируя ее. Что мне делать с конфигурацией сети, чтобы решить эту проблему?

Примечание: - Я хочу работать только с одним конкретным сайтом. Не нужно работать ни с одним сайтом


person Chamod    schedule 14.07.2020    source источник


Ответы (1)


Основная ошибка: 3 относится к коду ошибки SSL_UNTRUSTED, определенному в классе SslError (документация).

Это означает, что ваш клиент подключился к серверу с цепочкой сертификатов SSL, что недопустимо. В частности, ваше устройство не принимает корневой ЦС цепочки как доверенный. Возможно:

  • самоподписанный сертификат
  • a certificate chain with a root certificate that is not listed as a trusted root certificate in your keystore:
    • the root may have been dropped; e.g. for not being trustworthy!
    • корень может быть новым, о котором ваше (устаревшее) устройство еще не знает,
  • нарушенная цепочка сертификатов

Обратите внимание, что эти сценарии потенциально хуже / опаснее, чем сертификат с истекшим сроком действия.

Я бы начал с использования https://www.ssllabs.com/ssltest/ для проверки URL-адреса. и посмотрите, что там написано. В зависимости от того, что в нем написано, правильное исправление может быть одним из следующих:

  • Свяжитесь с владельцем сайта и попросите его обновить SSL-сертификат своего сайта.
  • Обновите свое устройство (на стороне клиента), чтобы получить текущий набор доверенных корневых сертификатов, одобренных вашим поставщиком.
  • Добавьте сертификат сервера (а не сертификаты корневого или промежуточного ЦС) в качестве доверенного сертификата в соответствии с инструкциями поставщика вашего устройства.

Обратите внимание, что последнее фактически говорит о том, что я доверяю этому серверу ... и вам следует делать это только в том случае, если вы можете безопасно получить сертификат сервера.

Это (ИМО) плохая идея для приложения Android делать это от имени пользователя. И плохая идея - доверять приложению, которое запрашивает разрешение на это. Если у вас нет серьезных гарантий, что приложение заслуживает доверия.

Почему? Поскольку приложение, которое может устанавливать доверенные корневые сертификаты, может установить плохой сертификат, открывая дверь для всякого рода неприятностей.


ОБНОВЛЕНИЕ

Результаты SSLTest показывают, что цепочка сертификатов является неполным, что объясняет, почему вы получаете ошибку SSL_UNTRUSTED

Вы должны сообщить об этом владельцу сайта:

  • Цепочка сертификатов неполная и должна быть исправлена.
  • На сайте установлено старое / устаревшее / устаревшее программное обеспечение SSL.
  • Сайт имеет ряд других уязвимостей безопасности.

Если они не реагируют, разумный курс действий - прекратить попытки использовать их сайт. К нему нельзя получить безопасный доступ.

person Stephen C    schedule 14.07.2020
comment
Большое спасибо за подробный ответ и за проверку моего SSLTest resutls и обновляя соответствующий ему ответ. - person Chamod; 14.07.2020
comment
Пожалуйста, дайте мне какое-либо предложение по этой проблеме. Я получаю эту ошибку, когда я загружаю URL-адрес веб-сайта в свой Android-браузер. Не удалось выполнить рукопожатие; вернулся -1, код ошибки SSL 1, net_error -218 и основная ошибка: 5 сертификат: выдан: cn = [сведения о компании], o = [подробности], l = [], st = [], c = pk; выдано: cn = digicert sha2 high assurance server ca, ou = www.digicert.com, o = digicert inc, c = us; по URL: [отдельный URL] - person Farhan Shah; 20.05.2021
comment
Я советую вам использовать SSLTest, как указано выше, для проверки хоста, к которому вы пытаетесь подключиться. - person Stephen C; 20.05.2021
comment
@StephenC, когда я использовал handle.proceed (); в функции onReceivedSslError () мой веб-просмотр успешно загружается в android. - person Farhan Shah; 20.05.2021
comment
Понятия не имею, что вы там говорите. Возможно, вам следует написать и опубликовать вопрос, точно указав, что вы делаете, что именно не так, и предоставив другую соответствующую информацию. В любом случае, задавать новые вопросы в качестве комментариев к чьим-то вопросам и ответам - плохой тон. - person Stephen C; 20.05.2021