WebView和SSL证书

bjo*_*rnb 6 ssl android android-webview

我在使用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的错误输出.如果我使用默认的浏览器应用程序会更加奇怪:即使我卸载之前提到的所有证书,它也会毫无问题地加载页面.我真的没有对我怎么能解决这个问题,而不信任所有certificats任何线索通过调用handler.proceed()onReceivedSslError()这是一个潜在的安全问题.任何帮助表示赞赏.谢谢!

干杯Bjoern

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

axi*_*tjz 2

好吧onReceiveSslError()handler.proceed()当连接到具有自签名证书的服务时应该使用,webview 与它们不兼容。

\n\n

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

\n\n

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

\n\n
openssl s_client -showcerts -connect yourhost.com:443\n\nopenssl s_client -connect yourhost.com:443\n\nopenssl s_client -servername yourhost.com -connect yourhost.com:443\n\nopenssl s_client -connect yourhost.com:443 | openssl x509 -text\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里您可以从 Android 文档中获得更多信息

\n\n
\n

主机名验证的常见问题 正如本文开头所提到的,验证 SSL 连接有两个关键部分。首先是验证证书是否来自受信任的来源,这是上一节的重点。本节的重点是第二部分:确保您正在交谈的服务器提供正确的证书。如果没有,您通常会看到\n如下错误:

\n\n

java.io.IOException:主机名“example.com”未在 libcore.net.http.HttpConnection.verifySecureSocketHostname(HttpConnection.java:223)\n 处验证\n 在 libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl) .java:446)\n 在 libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)\n 在 libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)\n 在 libcore.net。 http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282)\n 在 libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177)\n 在 libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271) \n 发生这种情况的原因之一是服务器配置错误。服务器配置的证书不具有与您尝试访问的服务器匹配的主题或主题备用名称字段。一个证书可以用于许多不同的服务器。例如,使用 openssl s_client -connect google.com:443 | 查看 google.com\n 证书 openssl\n x509 -text 您可以看到支持 *.google.com 的主题,但\n 还支持 *.youtube.com、*.android.com 和\n 其他主题的备用名称。仅当证书未将您要连接的服务器名称列为可接受的服务器名称时,才会出现此错误。

\n\n

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

\n\n

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

\n
\n\n

希望能帮助到你。

\n