【问题标题】:WebView and SSL certificatesWebView 和 SSL 证书
【发布时间】:2014-07-04 11:13:22
【问题描述】:

我在使用 Androids WebView 加载受 SSL 保护的网页时遇到问题。我总是收到如下错误: onReceivedSslError: primary error: 3 certificate: Issued to: CN=intranet.<company>.de,C=DE,O=<company>,OU=<compay org unit>

我已经通过设置->安全->从 SD 卡安装,将此服务器的证书链的所有证书安装到 Android 的钥匙串中。我什至可以看到其中一个已安装的证书与 LogCat 的错误输出完全匹配。 如果我使用默认的浏览器应用程序会变得更加奇怪:即使我卸载了前面提到的所有证书,它也会毫无问题地加载页面。 我真的不知道如何在不信任所有证书的情况下通过在onReceivedSslError() 中调用handler.proceed() 来解决此问题,这是一个潜在的安全问题。 任何帮助表示赞赏。谢谢!

干杯 比约恩

编辑:根证书是自签名的,因为它仅用于 Intranet 服务器。我认为我添加到 Android 受信任凭据的所有证书都是受信任的。

【问题讨论】:

  • 如果您希望我们提供帮助,您应该提供真实信息,而不是使用其他人的网站,例如 xyz.com(这是一个真实的网站)。
  • 抱歉,我使用了有效的主机。很遗憾,我不能透露有关客户的信息,希望您能理解这一点。

标签: android ssl android-webview


【解决方案1】:

onReceiveSslError()handler.proceed() 应该在使用自签名证书连接到服务时使用,webview 无法与它们相处。

我现在的想法是服务器端 ssl 实现。如果您有多个具有相同证书的服务,请检查 SNI 支持以及配置是否正确。然后查看您连接的服务是否返回正确的证书。还要从您的服务器检查主题备用名称并根据您的需要进行配置。

对于该任务,您可以使用这些命令。

openssl s_client -showcerts -connect yourhost.com:443

openssl s_client -connect yourhost.com:443

openssl s_client -servername yourhost.com -connect yourhost.com:443

openssl s_client -connect yourhost.com:443 | openssl x509 -text

这里有更多来自 Android 文档的信息

主机名验证的常见问题 如 在本文开头,验证 SSL 有两个关键部分 联系。首先是验证证书来自受信任的 源,这是上一节的重点。这个重点 部分是第二部分:确保您正在与之交谈的服务器 出示正确的证书。如果没有,您通常会看到 像这样的错误:

java.io.IOException:未验证主机名“example.com” 在 libcore.net.http.HttpConnection.verifySecureSocketHostname(HttpConnection.java:223) 在 libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:446) 在 libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290) 在 libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240) 在 libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282) 在 libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177) 在 libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271) 发生这种情况的一个原因是服务器配置错误。这 服务器配置了没有主题的证书 或与您所在的服务器匹配的主题备用名称字段 试图达到。可以将一个证书与 许多不同的服务器。例如,查看 google.com 带有 openssl s_client -connect google.com:443 的证书 | openssl x509 -text 你可以看到一个支持 *.google.com 但是的主题 *.youtube.com、*.android.com 和 其他。该错误仅在您连接的服务器名称时发生 to 未被证书列为可接受的。

不幸的是,这也可能由于另一个原因发生:虚拟 托管。当使用 HTTP 为多个主机名共享服务器时, Web 服务器可以从 HTTP/1.1 请求中分辨出哪个目标 客户端正在寻找的主机名。不幸的是,这很复杂 使用 HTTPS,因为服务器必须知道要返回哪个证书 在它看到 HTTP 请求之前。为了解决这个问题,更新 SSL 版本,特别是 TLSv.1.0 及更高版本,支持服务器名称 指示 (SNI),它允许 SSL 客户端指定预期的 主机名到服务器,以便可以返回正确的证书。

幸运的是,HttpsURLConnection 从 Android 2.3 开始就支持 SNI。 不幸的是,Apache HTTP 客户端没有,这是众多客户端之一 我们不鼓励使用它的原因。如果您需要支持,一种解决方法 Android 2.2(及更早版本)或 Apache HTTP 客户端将设置一个 唯一端口上的替代虚拟主机,以便明确 返回哪个服务器证书。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 2012-01-10
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多