【问题标题】:Android WebView SSL 'Security Warning'Android WebView SSL“安全警告”
【发布时间】:2010-09-02 19:21:08
【问题描述】:

我正在为客户构建应用的测试版本。此应用程序的一部分使用调用基于 SSL 的站点的 WebView。反过来,客户端提供了一个测试域,其中证书名称与 FQDN 不匹配。唉,他们无法提供匹配的证书。 :(

我正在使用一行代码在配套的 iOS ad hoc 应用程序上解决此问题(同样,不用于生产用途 - 仅用于测试目的)。我已经在 Android 操作系统上搜索过类似的信息,但相比之下,我在这里和其他地方看到的解决方案足以让我头晕目眩!

有没有一种简单的方法来解决这个问题?甚至隐藏在某个地方的面向用户的设置?

感谢线索!

【问题讨论】:

    标签: testing android webview ssl-certificate android-webview


    【解决方案1】:

    创建一个 WebViewClient 并处理如下所示的 onReceivedSslError:

    public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error)
    

    在此回调中,您只需调用handler.proceed(),页面将继续加载。如果您不处理此回调并调用 proceed() 方法,则默认行为将是页面不加载。

    【讨论】:

    • 警告:这很危险——它会删除 SSL 的所有安全性。我知道 Joe 只想将它包含在他的测试应用程序中,这很好,但是安全社区已经看到很多这样的代码在不经意间进入生产版本的情况下,默默地和不经意地损害了他们的安全性。因此,如果您像这样关闭安全性,请非常小心以确保它不会传播到您的发布版本。感谢您收听此公益公告。
    【解决方案2】:

    根据 Google 针对 SSL 错误处理程序的新安全政策更新更新了答案,请参阅此 Android 开发人员Help Center article

    为了防止因违反我们的恶意行为政策而在 Google Play 上拒绝申请。

    要正确处理 SSL 证书验证,请更改代码以在服务器提供的证书符合您的期望时调用 SslErrorHandler.proceed(),否则调用 SslErrorHandler.cancel()。

    例如,我添加了一个警告对话框以使用户确认并且似乎 Google 不再显示警告。

    @Override
    public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
     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?";
    
        builder.setTitle("SSL Certificate Error");
        builder.setMessage(message);
    
    builder.setPositiveButton("continue", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            handler.proceed();
        }
    });
    builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            handler.cancel();
        }
    });
    final AlertDialog dialog = builder.create();
    dialog.show();
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-14
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      相关资源
      最近更新 更多