9

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

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

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

线索赞赏!

4

2 回答 2

6

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

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

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

于 2012-05-12T18:01:43.653 回答
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();

}

于 2016-07-15T06:23:27.497 回答