安卓WebView SSL“安全警告”

9
我正在为客户构建一个测试版应用程序。该应用程序的一部分使用WebView调用基于SSL的站点。然而,客户提供了一个证书名称与FQDN不匹配的测试域。遗憾的是,他们无法提供匹配的证书。:(
我在iOS伴侣ad hoc应用程序中使用了一行代码来解决此问题(再次强调,仅用于测试目的,不用于生产)。我已经搜索了Android OS上类似的信息,但是这里和其他地方看到的解决方案足以使我头晕目眩!
有没有简单的方法来解决这个问题?甚至是隐藏在某个用户界面设置中的选项?
感谢您提供线索!
2个回答

6
创建一个WebViewClient并处理onReceivedSslError,代码如下所示:
public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error)

在这个回调函数里,你只需要调用 handler.proceed() 页面就会继续加载。如果你不处理这个回调函数并且调用 proceed() 方法,那么默认行为就是页面不会加载。

1
警告:这是危险的——它会从SSL中删除所有安全性。我知道Joe想在他的测试应用程序中包含它,这很好,但安全社区已经看到了许多这种代码无意中进入生产版本的情况,默默地并无意中破坏了他们的安全性。因此,如果您像这样关闭安全性,请非常小心,确保它不会传播到您的发布版本。谢谢您收听这个公共服务广播。 - D.W.

1

根据Google的新安全策略更新SSL错误处理程序的答案,请查看此Android开发者帮助中心文章

为了避免应用程序因违反我们的恶意行为政策而被拒绝在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();

}


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