2014-07-04 202 views
5

加载SSL安全Web页面与Android WebView时出现问题。我总是得到这样的错误: onReceivedSslError: primary error: 3 certificate: Issued to: CN=intranet.<company>.de,C=DE,O=<company>,OU=<compay org unit>WebView和SSL证书

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

干杯 比约恩·

编辑:根证书是自签名的,因为它只是为了用于内部网服务器。我认为我添加到Android受信任证书的所有证书都是可信的。

+0

如果您希望我们提供帮助,您应该提供真实信息,而不是使用像xyz.com这样的其他人的网站(这是一个真实的网站)。 – jww

+0

对不起,我使用了一个有效的主机。不幸的是,我不能透露有关客户的信息,并希望你能理解这一点。 – bjoernb

回答

2

当连接到具有自签名证书的服务时,应使用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) 这可能发生的一个原因是由于服务器配置错误。 服务器配置有证书,该证书没有主题 或使用替代名称字段与您尝试访问的服务器 相匹配。可以将多个不同的服务器与一个证书一起使用。例如,使用openssl查看google.com 证书s_client -connect google.com:443 | OpenSSL的 X509 -text你可以看到,支持* .google.com但 也受到替代名称为* .youtube.com主题,* .android.com和 等。只有当您连接的服务器名称 未被证书列为可接受时才会出现此错误。

不幸的是这可能发生的另一个原因还有:虚拟主机 。当使用HTTP共享多个主机名的服务器时,网络服务器可以从HTTP/1.1请求中知道客户端正在查找的目标主机名为 。不幸的是,由于服务器在看到HTTP请求之前必须知道哪个证书要返回 ,因此使用HTTPS将其复制为 。为了解决这个问题,新版本 SSL,具体TLSv.1.0及更高版本,支持服务器名称 指示(SNI),允许SSL客户端指定目的 主机名到服务器,以适当的证书可以返回。

幸运的是,自Android 2.3以来,HttpsURLConnection支持SNI。 不幸的是,Apache HTTP Client不支持,这是我们不鼓励使用它的许多原因之一。一个解决办法,如果你需要支持 的Android 2.2(及以上)或Apache HTTP客户端是建立一个 替代虚拟主机的唯一端口上,这样它的明确的 要返回的服务器证书。

希望它有帮助。