如何在Android WebView中加载HTTPS URL而不使用SSL?

13

我在Playstore标记了一个问题,谷歌发送邮件说我的应用程序不安全,因为使用了SSL。

目前在我的应用程序中,我有一个webview,它加载了一个包含https链接的页面。

在Web设置中,我做了如下操作:

web.setWebViewClient(new SSLTolerentWebViewClient());

为了忽略SSL证书,我使用以下代码,但由于忽略证书,Play store显示我的应用程序不安全。

private class SSLTolerentWebViewClient extends WebViewClient {
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        handler.proceed(); // Ignore SSL certificate errors
    }
}

有人能向我建议如何做到我的WebView可以处理https url,而Playstore不会将我的应用标记为不安全吗?


1
为什么你要忽略SSL证书错误? - Bhargav
这是错误的,你需要找出你遇到了哪些 SSL 错误并修复它,因为 HTTPS 网站必须通过 SSL 进行通信,而要实现这一点,SSL 证书非常重要。 - Bhargav
你能给我建议吗?我该怎么做?有什么参考资料吗?好的,你说了,我告诉你onReceivedSslError出现了哪个错误? - Ajay Pandya
记录好 SslError,并将错误文本发布在这里,也许我可以帮助。 - Bhargav
检查您要连接的站点/服务是否具有有效证书,并在SSL握手中提供所有中间证书。 您可以使用Qualys SSL Labs服务器测试(https://www.ssllabs.com/ssltest/index.html)之类的工具来确定此内容。 - Anand Bhat
显示剩余3条评论
3个回答

35

解决Google Play警告:WebViewClient.onReceivedSslError处理程序

并不总是强制执行handler.proceed();,您还需要包括handler.cancel();以便用户可以避免加载不安全的内容。

处理WebViewClient.onReceivedSslError处理程序的不安全实现,请使用以下代码

 webView.setWebViewClient(new SSLTolerentWebViewClient());
 webView.loadUrl(myhttps url);

需要翻译的内容:

and

 private class SSLTolerentWebViewClient extends WebViewClient {
    public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {

        AlertDialog.Builder builder = new AlertDialog.Builder(Tab1Activity.this);
        AlertDialog alertDialog = builder.create();
        String message = "SSL Certificate error.";
        switch (error.getPrimaryError()) {
            case SslError.SSL_UNTRUSTED:
                message = "The certificate authority is not trusted.";
                break;
            case SslError.SSL_EXPIRED:
                message = "The certificate has expired.";
                break;
            case SslError.SSL_IDMISMATCH:
                message = "The certificate Hostname mismatch.";
                break;
            case SslError.SSL_NOTYETVALID:
                message = "The certificate is not yet valid.";
                break;
        }

        message += " Do you want to continue anyway?";
        alertDialog.setTitle("SSL Certificate Error");
        alertDialog.setMessage(message);
        alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // Ignore SSL certificate errors
                handler.proceed();
            }
        });

        alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

                handler.cancel();
            }
        });
        alertDialog.show();
    }
}

我们应该在网络上找到一个解决方案,将我们的证书嵌入并添加到受信任的密钥库中。这可以避免在此类漏洞上发生中间人攻击。 - Alex

3

仅供以后参考或面对同样问题的人!使用Xamarin Forms。

它有效,这是我使用的完整代码。它还修复了另一个bug,即在使用Xamarin Shell时WebView的滚动不再工作。

using System;
using Android.Content;
using Android.Views;
using Mobile.Droid.Render;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(WebView), typeof(MyWebViewRenderer))]
namespace Mobile.Droid.Render
{
    public class MyWebViewRenderer : WebViewRenderer
    {
        public MyWebViewRenderer(Context context) : base(context)
        {
        }

        public override bool DispatchTouchEvent(MotionEvent e)
        {
            Parent.RequestDisallowInterceptTouchEvent(true);
            return base.DispatchTouchEvent(e);
        }


        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {
            base.OnElementChanged(e);

            // Setting the background as transparent
            this.Control.SetBackgroundColor(Android.Graphics.Color.Transparent);
            if (e.OldElement == null)
            {
                Control.SetWebViewClient(new MyFormsWebViewClient(this));
            }
        }

        internal class MyFormsWebViewClient : FormsWebViewClient
        {
            MyWebViewRenderer _renderer;

            public MyFormsWebViewClient(MyWebViewRenderer renderer) : base(renderer)
            {
                _renderer = renderer;
            }

            public override void OnReceivedSslError(Android.Webkit.WebView view, Android.Webkit.SslErrorHandler handler, Android.Net.Http.SslError error)
            {
                handler.Proceed();
            }

            public override void OnPageFinished(Android.Webkit.WebView view, string url)
            {
                base.OnPageFinished(view, url);
            }

            public override void OnLoadResource(Android.Webkit.WebView view, string url)
            {
                base.OnLoadResource(view, url);
            }
        }
    }
}

-4

尝试使用 http 链接到网页,而不是 https。这可能会重定向到 https 网站。您将不需要编码来忽略安全证书。


是的,我尝试过这样做,但如果我从“https”中删除“s”,它会显示为空白,加载不正确。 - Ajay Pandya
如果您尝试在应用程序外部加载,会发生什么情况?即从您的活动或自己的Web视图客户端代码中删除WebView myWebView =(WebView)findViewById(R.id.webview); myWebView.setWebViewClient(new WebViewClient()); - Fred Knerk
是的,使用WebView客户端或ChromeView加载没有问题,但我只想在应用程序屏幕上显示。 - Ajay Pandya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接