【问题标题】:How can load https url without use of ssl in android webview如何在不使用 ssl 的情况下在 android webview 中加载 https url
【发布时间】:2016-06-04 18:55:48
【问题描述】:

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

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

在网络设置上我这样做:

web.setWebViewClient(new SSLTolerentWebViewClient());

要忽略 ssl 证书,我使用以下代码,但由于忽略证书 playstore 显示我的应用程序不安全

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

谁能建议我如何做到这一点,以便我的WebView 可以处理 https url 并且 Playstore 不会将我的应用标记为不安全?

【问题讨论】:

  • 为什么要忽略 ssl 证书错误?
  • 如果我们不忽略网页不加载所以我正在使用它但现在 Playstore 显示警告他们将来可能会拒绝应用程序。
  • 这是错误的,您需要找出您遇到的 ssl 错误并进行修复,因为 https 网站必须通过 ssl 进行通信,并且要发生这种情况,ssl 证书非常重要
  • 您能建议我如何参考吗?好的,你说我告诉你 onReceivedSslError 发生了哪个错误,对吧?
  • 好好记录SslError并在此处发布错误文本然后也许我可以提供帮助

标签: android ssl webview


【解决方案1】:

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

并不总是强制 handler.proceed();但你还必须包括 handler.cancel();这样用户就可以避免加载 unsaif 内容。

处理 WebViewClient.onReceivedSslError 处理程序的不安全实现

使用下面的代码

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

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

【讨论】:

  • 我们应该在网上真正看到嵌入我们的证书并将其添加到受信任的密钥库中的答案。它应该避免对这类漏洞进行中间人攻击。
【解决方案2】:

仅供将来参考或其他面临相同问题的人参考!使用 Xamarin 表单。

它有效,这是我使用的完整代码。它还修复了另一个错误,即使用 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);
            }
        }
    }
}

【讨论】:

    【解决方案3】:

    尝试使用 http 而不是 https 链接到网页。这可能会重定向到 https 站点。您无需编写代码即可忽略安全证书。

    【讨论】:

    • 是的,我试过了,但如果我尝试从 https 中删除 s 时,它会显示空白,但无法正确加载。
    • 如果您尝试在应用程序外部加载会发生什么?即删除 WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.setWebViewClient(new WebViewClient());来自您的活动或您自己的 webview 客户端代码(如果有)。
    • 是的,使用 webview 客户端或 chromeview 加载没有问题,但我只想要在应用程序屏幕中,这就是原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2013-08-12
    • 2013-11-21
    • 1970-01-01
    • 2018-06-01
    相关资源
    最近更新 更多