2010-09-02 144 views
9

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

我正在解决这个问题的伴随iOS的特设应用程序与一行代码(再次,不生产使用 - 仅用于测试目的)我已经搜索了Android操作系统的类似信息,但我在这里和其他地方看到的解决方案是足以让我的头部比较大的旋转时间!

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

线索赞赏!

回答

6

创建一个WebViewClient并处理看起来像这样的onReceivedSslError:

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

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

+1

警告:这是危险的 - 它会从所有SSL安全。我知道Joe希望将它包含在他的测试应用程序中,这很好,但是安全社区已经看到很多情况下,这类代码无意中进入了生产版本,无声无息地危及他们的安全。因此,如果您关闭此类安全性,请务必小心以确保它不会传播到您的发行版本。感谢您收听此公告。 – 2013-02-25 22:20:52

0

根据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(); 

}