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