Android Webview で SSL 証明書エラーを処理する適切な方法を見つけようとしています。私の目標は、SSL 証明書エラーのあるページを読み込む方法を提供することですが、ユーザーが証明書エラーのある URL を読み込もうとするたびにセキュリティについて警告した後、ページを読み込むことを選択できるようにすることです。
スレッドで見つけた最も近い解決策は、次のように WebViewClient をオーバーライドすることを提案しています。
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(final WebView view, final SslErrorHandler handler, final SslError error) {
handler.proceed();
}
});
ただし、これは基本的に、ユーザーの同意なしに WebView で SSL を無効にします。
参考までに、その解決策を見つけたスレッドを次に示します。
Android WebView SSL の「セキュリティ警告」
Android の Web ビューは SSL をサポートしていますか?
Android WebView が HTTPS URL をロードしない
Android で WIFI を使用している場合、URL のロード後に Web ビューに空白/白いページが表示される
Android WebView で特定の Web ページを読み込めません
Android WebView は、https から http へのリダイレクトをブロックします
私は先に進み、ユーザーにプロンプトを表示するわずかに異なるバージョンを実装しました:
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();
}
});
}
});
この実装では、ページをロードするかどうかをユーザーに 2 回尋ねます。ユーザーが 2 回はいと言った場合、エラーは無視されてページがロードされます。それ以外の場合、ページのロードはキャンセルされます。
証明書エラーがロードされた URL が最初にWebViewClient.onReceivedSslError
呼び出されたときに呼び出されますが、ユーザーが証明書エラーを続行してSslErrorHandler.proceed()
呼び出された場合、2 回目以降は同じ 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();
が呼び出された後、同じ URL に対してWebView をWebViewClient.onReceivedSslError
複数回呼び出す方法を知っSslErrorHandler.proceed()
ている人はいますか?