Android WebView SSL’安全警告’

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

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

有解决这个问题的简单方法吗? 即使面向用户的设置隐藏在某个地方?

线索赞赏!

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

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

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

根据Google针对SSLerror handling程序的新安全策略更新更新了答案,请参阅此Android开发人员帮助中心文章 。

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

要正确处理SSL证书validation,只要服务器提供的证书符合您的期望,就更改代码以调用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(); 

}