Я пытаюсь найти правильный способ обработки ошибок сертификата SSL в Android Webview. Моя цель - предоставить способ загрузки страниц с ошибками сертификата SSL, но пусть пользователь решит загрузить страницу после предупреждения о безопасности при попытке загрузить URL-адрес с ошибками сертификата.. p >
Ближайшие решения, которые я нашел в потоках, предлагают переопределить WebViewClient следующим образом:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(final WebView view, final SslErrorHandler handler, final SslError error) {
handler.proceed();
}
});
Однако это в основном отключает SSL в WebView без согласия пользователя.
Для справки приведены темы, в которых я нашел это решение:
Предупреждение безопасности Android WebView SSL
Поддерживает ли веб-представление на Android поддержку SSL?
Android WebView не загружает URL HTTPS
веб-просмотр android с сертификатом клиента
Невозможно загрузить определенную веб-страницу в веб-браузере Android
WebView отображает пустой вид для определенных ссылок
Android WebView блокирует перенаправление с https на http
Игнорировать запросы сертификата ssl в веб-браузере
Я пошел вперед и внедрил немного другую версию, которая подсказывает пользователю:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(final WebView view, final SslErrorHandler handler, final SslError error) {
//Showing a first confirmation dialog
AndroidUtils.showYesNoDialog(
//First confirmation message
"WARNING - THIS PAGE IS NOT SECURE! Are you sure you want to continue loading it?",
//First confirmation "YES" option runnable
new Runnable() {
@Override
public void run() {
//Showing a second confirmation dialog
AndroidUtils.showYesNoDialogWithResId(
//Second confirmation message
"You chose to load an unsecure page, are you sure you want to do that?",
//Second confirmation "YES" option runnable
new Runnable() {
@Override
public void run() {
//Disregard the error and proceed with the bad certificate anyways
handler.proceed();
}
},
//Second confirmation "NO" option runnable
new Runnable() {
@Override
public void run() {
//Cancel loading the page with that certificate error
handler.cancel();
}
}
);
}
},
//First confirmation "NO" option runnable
new Runnable() {
@Override
public void run() {
//Cancel loading the page with that certificate error
handler.cancel();
}
});
}
});
Эта реализация запрашивает пользователя дважды, если он хочет загрузить страницу, если он говорит "да" дважды, тогда ошибка игнорируется и страница загружается, в противном случае загрузка страницы отменяется.
В первый раз, когда URL-адрес с загрузкой сертификатов загружается, WebViewClient.onReceivedSslError
вызывается, однако, если пользователь отправляется с ошибкой сертификата и вызывается SslErrorHandler.proceed()
, то при загрузке одного и того же URL-адреса WebViewClient.onReceivedSslError
больше не вызывается: только убийство приложения сбрасывает это поведение.
Я бы хотел, чтобы WebViewClient.onReceivedSslError
назывался систематически, когда URL-адрес с ошибкой сертификата загружается не только в первый раз. Я пробовал эти методы без успеха:
/** JAVADOC QUOTE: Clears the SSL preferences table stored in response to proceeding with SSL certificate errors.*/
webView.clearSslPreferences();
//Those other methods I tried out of despair just in case
webView.clearFormData();
webView.clearCache(true);
webView.clearHistory();
webView.clearMatches();
Кто-нибудь знает, как сделать вызов WebView WebViewClient.onReceivedSslError
более одного раза для одного и того же URL-адреса после того, как SslErrorHandler.proceed()
был вызван?