【问题标题】:Override onReceivedSslError does not work with Android KitKat Web view覆盖 onReceivedSslError 不适用于 Android KitKat Web 视图
【发布时间】:2014-03-18 09:55:42
【问题描述】:

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

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

                    handler.proceed();
}

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

【问题讨论】:

  • 我在 Android 4.3 和 4.1.1 上遇到了同样的问题!
  • public void onProceededAfterSslError(WebView view, SslError error){}吗?
  • 我面临同样的问题,我尝试访问的 URL 使用自定义端口(不是 443)。我还尝试了一个端口为 443 的 URL,该 URL 具有不受信任的证书,并且按预期调用了 onReceivedSslError。我认为只有当端口不是 443 时才会出现此问题。您能确认一下吗?

标签: ssl webview certificate android-4.4-kitkat


【解决方案1】:

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

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

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

对我来说,根本问题是 Web 服务器没有公开完整的证书链,而只公开了最后一个证书,让设备负责验证完整的链,前提是它具有存储在设备证书存储中的所有证书,而 Android 设备并非如此。 您可以通过以下方式确定这是否也是您的问题:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    Source

    【讨论】:

      【解决方案3】:

      你尝试过这样的事情吗?

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

      【讨论】:

      • 谷歌不再允许这样做,他们只是给我发了一封电子邮件,以便在我的一个应用中解决这个问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多