16

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 WebView

Android で WIFI を使用している場合、URL のロード後に Web ビューに空白/白いページが表示される

Android WebView で特定の Web ページを読み込めません

WebView は、特定のリンクの空白のビューを表示します

Android WebView は、https から http へのリダイレクトをブロックします

WebView で 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();
                }
            });
    }
});

この実装では、ページをロードするかどうかをユーザーに 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()ている人はいますか?

4

3 に答える 3