我建立一个应用程序的测试版本为客户端。这个应用程序的一部分使用了召唤出一个基于SSL的站点的WebView。反过来,客户端已经提供的测试域,其中证书名称不匹配的FQDN。唉,他们不是来规定的位置上的证书相匹配。 :(

我解决此问题工作的同伴的iOS专案应用与一行代码(再次,而不是用于生产 - 只是为了测试目的)。我已经寻找在Android OS类似的信息,但解决方案我在这里看到的和其他地方有足够的通过比较来把我弄得晕头转向大时间!

有没有办法解决这个简单的方法?即使是面向用户的设置藏某处?

线索理解!

有帮助吗?

解决方案

创建WebViewClient和处理onReceivedSslError看起来像这样:

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

这里面回调,你可以只调用handler.proceed()和页面会继续加载。如果你不处理这个回调并调用proceed()方法,则默认行为将是网页无法加载。

其他提示

根据谷歌的SSL错误处理新的安全策略更新更新的回答,请参阅本Android开发的帮助中心文章

有关防止排斥在谷歌Play应用程序的违反我们的恶意行为的政策。

要正确处理SSL证书验证,更改您的代码来调用SslErrorHandler.proceed()无论何时由服务器提供的凭证符合您的期望,并调用SslErrorHandler.cancel(),否则。

例如,我添加一个警告对话框,使用户证实,似乎谷歌不再显示警告。

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

}

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top