ssl - 覆盖 onReceivedSslError 不适用于 Android KitKat Web View

标签 ssl webview certificate android-4.4-kitkat

当访问具有不受信任的证书的 https URL 时,我可以绕过 SSL 错误,使用以下代码和 KitKat 版本以下的 WebView

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

                    handler.proceed();
}

但它不适用于 KitKat 浏览器。有什么解决办法吗?

最佳答案

我最近也遇到了这个问题,这没有记录,但似乎在 Android 4.4 KitKat 上调用方法 onReceivedSslError 取决于 SSL 错误的类型。我检查了这两种情况:

  • 如果 SSL 错误是由于自签名服务器证书引起的,它会像在旧版本中那样调用 Android KitKat 4.4 中的 onReceivedSslError 方法。

  • 但是,如果 SSL 错误原因是错误的证书链(LogCat 显示消息:“无法验证证书链,错误:java.security.cert.CertPathValidatorException:找不到证书路径的信任 anchor 。 ",然后在 KitKat 中没有调用 onReceivedSslError,因为它在旧的 Android 版本中被调用,因此在 4.4 中不能忽略或绕过错误。这是我的情况,我不知道这是一个错误还是故意的以防止 MITM 攻击,但我没有找到解决此问题的编程方法。

对我来说,潜在的问题是 Web 服务器没有公开完整的证书链,而只公开了最后一个证书,将验证完整链的责任留给了设备,前提是它具有存储在设备证书存储中的所有证书,而 Android 设备则不然。 您可以通过以下方式确定这是否也是您的问题:

a) 使用在线证书检查器检查证书链,例如:http://www.digicert.com/help/

b) 使用 openssl 验证收到的证书链: openssl s_client -showcerts -connect :443 你可以在那里看到证书链,它应该包含两个或更多证书,如果结果以这样的结尾: 验证返回码:21(无法验证第一个证书), 您可能会遇到与我类似的问题。

解决方案是修复 Web 服务器配置,以便服务器向主机公开完整的证书链。

关于ssl - 覆盖 onReceivedSslError 不适用于 Android KitKat Web View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22475761/

相关文章:

ssl - Wireshark 使用私钥解密 TLS

ruby-on-rails - 确定当前页面是否在 Rails 中使用 SSL

javascript - 如何在不访问 http ://getfirebug. com 的情况下包含 Firebug 灯?

node.js - 如何使用 Nodejs 获取有关完整证书链的信息?

javascript - 您如何对网站进行编程以使用证书进行身份验证?

ssl - 应该为www.domain.com 还是domain.com 制作SSL 证书,应该如何配置?

java - 忽略 Apache HttpClient 4.3 中的 SSL 证书

android - 针对不安全的 TrustManager 的 Google Play 安全警报

java - Android Webview 的启动屏幕

android - 我使用 WebView 作为 Activity 的背景。但软键不能正常工作