覆盖onReceivedSslError不适用于Android KitKat Web视图

时间:2014-03-18 09:55:43

标签: ssl webview certificate android-4.4-kitkat

我可以在访问具有不受信任证书的https URL时绕过SSL错误,其中包含以下代码的WebView以下版本KitKat

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

                    handler.proceed();
}

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

3 个答案:

答案 0 :(得分:4)

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

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

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

对我来说,潜在的问题是Web服务器没有暴露完整的证书链,只暴露了最后一个证书,只要它具有存储在设备证书库中的所有证书,设备就有责任验证整个链。 ,Android设备并非如此。 您可以通过以下方式确定这是否也是您的问题:

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

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

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

答案 1 :(得分:1)

在Android 4.4上运行时,您的应用可能会有不同的行为,尤其是当您将应用的targetSdkVersion更新为“19”或更高时。

WebView类及相关API的基础代码已升级为基于Chromium源代码的现代快照。

这为性能提供了各种改进,支持新的HTML5功能,并支持远程调试WebView内容。此升级的范围意味着如果您的应用程序使用WebView,则在某些情况下它的行为可能会受到影响。虽然已记录的已知行为更改仅在您将应用的targetSdkVersion更新为“19”或更高版本时影响您的应用 - 新的WebView以“怪癖模式”运行,以便在针对API级别18的应用中提供一些旧版功能更低 - 您的应用程序可能依赖于以前版本的WebView中的未知行为。

因此,如果您的现有应用使用WebView,请务必尽快在Android 4.4上进行测试,并在将targetSdkVersion更新为“19”或更高版本时咨询Migrating to WebView in Android 4.4以获取有关应用可能受到影响的信息

Source

答案 2 :(得分:-3)

你尝试过这样的事吗?

    mWebView.setWebViewClient(new WebViewClient()       
    {
        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            handler.proceed(); // Ignore SSL certificate errors
        }
    });
相关问题