Webview избегает предупреждения безопасности из игры Google при реализации onReceivedSslError

У меня есть ссылка, которая откроется в webview. Проблема в том, что он не может быть открыт, пока я не переопределяю onReceivedSslError следующим образом:

@Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); } 

Я получаю предупреждение о безопасности от игры Google, говоря:

Предупреждение о безопасности У вашего приложения есть небезопасная реализация обработчика WebViewClient.onReceivedSslError. В частности, реализация игнорирует все ошибки проверки сертификата SSL, делая ваше приложение уязвимым для атак типа «человек в середине». Злоумышленник может изменить содержимое затронутого WebView, прочитать переданные данные (например, учетные данные для входа) и выполнить код внутри приложения с помощью JavaScript.

Чтобы правильно обрабатывать SSL-сертификат, измените свой код, чтобы вызывать SslErrorHandler.proceed (), когда сертификат, представленный сервером, соответствует вашим ожиданиям, и вызовите SslErrorHandler.cancel () в противном случае. На ваш адрес учетной записи разработчика отправлено уведомление по электронной почте, содержащее затронутые приложения и классы (ы).

Пожалуйста, устраните эту уязвимость как можно скорее и увеличьте номер версии обновленного APK. Дополнительные сведения о обработчике ошибок SSL см. В нашей документации в Справочном центре разработчика. По другим техническим вопросам вы можете опубликовать https://www.stackoverflow.com/questions и использовать теги «android-security» и «SslErrorHandler». Если вы используете стороннюю библиотеку, которая несет ответственность за это, сообщите об этом Третьих лиц и работать с ними для решения проблемы.

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

Обратите внимание, что эти конкретные проблемы могут не повлиять на каждое приложение, использующее WebView SSL, лучше всего обновлять все патчи безопасности. Приложения с уязвимостями, которые подвергают пользователей риску компромисса, могут считаться опасными продуктами в нарушение Политики контента и раздела 4.4 Соглашения о распространении программного обеспечения.

Убедитесь, что все опубликованные приложения соответствуют Соглашению о распространении программного обеспечения и Политике контента. Если у вас есть вопросы или проблемы, обратитесь в нашу службу поддержки через Справочный центр разработчика Google Play.

Если я удалю onReceivedSslError (handler.proceed()) , страница не откроется.

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

Solutions Collecting From Web of "Webview избегает предупреждения безопасности из игры Google при реализации onReceivedSslError"

Чтобы правильно обрабатывать SSL-сертификат, измените свой код, чтобы вызывать SslErrorHandler.proceed (), когда сертификат, представленный сервером, соответствует вашим ожиданиям, и вызовите SslErrorHandler.cancel () в противном случае.

Как говорится в сообщении электронной почты, onReceivedSslError должен обрабатывать пользователя, переходящего на страницу с недопустимым сертификатом, например, диалоговое окно уведомления. Вы не должны действовать прямо.

Например, я добавляю диалоговое окно с предупреждением, чтобы пользователь подтвердил и, похоже, Google больше не показывает предупреждение.


 @Override public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) { final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage(R.string.notification_error_ssl_cert_invalid); builder.setPositiveButton("continue", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { handler.proceed(); } }); builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { handler.cancel(); } }); final AlertDialog dialog = builder.create(); dialog.show(); } 

Подробнее объясните по электронной почте.

В частности, реализация игнорирует все ошибки проверки сертификата SSL, делая ваше приложение уязвимым для атак типа «человек в середине».

В сообщении электронной почты говорится, что реализация по умолчанию игнорировала важную проблему безопасности SSL. Поэтому нам нужно обработать это в нашем собственном приложении, которое использовало WebView. Уведомлять пользователя с диалоговым окном оповещения – это простой способ.

Fix, который работает для меня, просто отключает функцию onReceivedSslError определенную в AuthorizationWebViewClient . В этом случае handler.cancel будет вызываться в случае ошибки SSL. Однако он работает хорошо с сертификатами SSL одного диска. Протестировано на Android 2.3.7, Android 5.1.

Согласно предупреждению безопасности Google: небезопасная реализация интерфейса X509TrustManager , Google Play не будет поддерживать X509TrustManager с 11 июля 2016 года:

Привет, разработчик Google Play,

Ваши приложения, указанные в конце этого письма, используют небезопасную реализацию интерфейса X509TrustManager. В частности, реализация игнорирует все ошибки проверки сертификата SSL при установлении HTTPS-соединения с удаленным хостом, тем самым делая ваше приложение уязвимым для атак типа «человек-в-середине». Злоумышленник может читать переданные данные (например, учетные данные для входа) и даже изменять данные, передаваемые по HTTPS-соединению. Если у вас более 20 затронутых приложений в вашей учетной записи, просмотрите Консоль разработчика для получения полного списка.

Чтобы правильно обрабатывать сертификаты SSL, измените свой код в методе checkServerTrusted вашего пользовательского интерфейса X509TrustManager, чтобы поднять либо исключение CertificateException, либо исключение IllegalArgumentException всякий раз, когда сертификат, представленный сервером, не соответствует вашим ожиданиям. По техническим вопросам вы можете отправлять сообщения в Stack Overflow и использовать теги «android-security» и «TrustManager».

Пожалуйста, задайте этот вопрос как можно скорее и увеличьте номер версии обновленного APK. Начиная с 17 мая 2016 года Google Play заблокирует публикацию любых новых приложений или обновлений, содержащих небезопасную реализацию интерфейса X509TrustManager.

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

Хотя эти конкретные проблемы могут не влиять на каждое приложение с реализацией TrustManager, лучше не игнорировать ошибки проверки сертификата SSL. Приложения с уязвимостями, которые подвергают пользователей риску компромисса, могут считаться опасными продуктами в нарушение Политики контента и раздела 4.4 Соглашения о распространении программного обеспечения.

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

 @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { final SslErrorHandler handlerFinal; handlerFinal = handler; int mensaje ; switch(error.getPrimaryError()) { case SslError.SSL_DATE_INVALID: mensaje = R.string.notification_error_ssl_date_invalid; break; case SslError.SSL_EXPIRED: mensaje = R.string.notification_error_ssl_expired; break; case SslError.SSL_IDMISMATCH: mensaje = R.string.notification_error_ssl_idmismatch; break; case SslError.SSL_INVALID: mensaje = R.string.notification_error_ssl_invalid; break; case SslError.SSL_NOTYETVALID: mensaje = R.string.notification_error_ssl_not_yet_valid; break; case SslError.SSL_UNTRUSTED: mensaje = R.string.notification_error_ssl_untrusted; break; default: mensaje = R.string.notification_error_ssl_cert_invalid; } AppLogger.e("OnReceivedSslError handel.proceed()"); View.OnClickListener acept = new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); handlerFinal.proceed(); } }; View.OnClickListener cancel = new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); handlerFinal.cancel(); } }; View.OnClickListener listeners[] = {cancel, acept}; dialog = UiUtils.showDialog2Buttons(activity, R.string.info, mensaje, R.string.popup_custom_cancelar, R.string.popup_custom_cancelar, listeners); }