Web 视图客户端在重新创建片段时返回"Couldn't establish a secure connection."



我们的应用程序有选项卡,其中一个片段可以包含一个webview客户端。用户现在报告webviewclient无法加载页面的问题。我们已经确认服务器已启动并运行,我们还发现该问题发生在v4.3和所有早期版本中。我们还确认它在v5.0中运行良好;目前,我们还无法测试它在4.4中是否有效(我想,只有当有人知道4.4及更新版本中发生的更改会导致所有早期版本出现故障时,这些信息才会有所帮助)。

因此,实际的问题是,我们创建了webviewclient并将其加载到片段中,在这种情况下,所有版本的网页(通过HTTPS连接到)每次都会完美加载。对于v5.0,我们可以单击不同的选项卡,然后使用webviewclient返回该选项卡;我们可以看到片段正在创建中,一切都如预期一样工作,网页加载如预期。但对于v4.3及更早版本,我们看到片段正在创建中,但webviewclient启动onReceivedError并返回-11错误代码(无法建立安全连接)。在调试日志中,我们得到了一个握手错误,下面是调用的日志。有趣的是,我们正在连接的网站可以接受TLS1.2;我们可以看到,当我们使用Firefox和开发工具等访问URL时,这个错误也很有趣。

04-24 14:38:52.415: W/chromium(15434): external/chromium/net/http/http_stream_factory_impl_job.cc:865: [0424/143852:WARNING:http_stream_factory_impl_job.cc(865)] Falling back to SSLv3 because host is TLS intolerant: 
04-24 14:38:52.446: V/chromium(15434): external/chromium/net/socket/ssl_client_socket_openssl.cc:310: [0424/143852:INFO:ssl_client_socket_openssl.cc(310)] ssl_ctx_ is used
04-24 14:38:52.469: E/chromium(15434): external/chromium/net/socket/ssl_client_socket_openssl.cc:899: [0424/143852:ERROR:ssl_client_socket_openssl.cc(899)] handshake failed; returned 0, SSL error code 5, net_error -107
04-24 14:38:52.469: V/chromium(15434): external/chromium/net/socket/ssl_client_socket_openssl.cc:508: [0424/143852:INFO:ssl_client_socket_openssl.cc(508)] ~SSLClientSocketOpenSSL()
04-24 14:38:52.469: I/GATE(15434): <GATE-M>DEV_ACTION_ERROR</GATE-M>
04-24 14:38:52.477: V/webkit(15434): reportError errorCode(-11) desc(Couldn't establish a secure connection.)
04-24 14:38:52.532: I/GATE(15434): <GATE-M>DEV_ACTION_COMPLETED</GATE-M>

四处挖掘看起来我们可能需要覆盖SSLProtocolFactory;但这似乎是针对自签名证书等。我们正在连接一个知名的第三方,他们的证书似乎没有任何问题。和往常一样,这可能感觉像是我们在早期版本的Android中缺少的东西;或者为一些在新版本中已经修复但不确定下一步该去哪里的东西进行变通。

这似乎是Android v4.3及更早版本中的一个错误,现在谷歌没有维护,也不会进行修补。我们正在连接的网站正在运行TLS,但最近已关闭SSLv3。它是一家支付提供商,PCI合规性迫使提供商在未来一年禁用SSLv3和早期版本的TLS,以保持合规性。我们还发现,虽然该版本的Android上的Chrome能够正确地与网站通信,但原生的Android浏览器却不能(因此与我们在WebViewClient中看到的内容重复)。令人沮丧的是,这意味着似乎没有一个安全的解决方案来解决这个问题。可能会覆盖SSLProviderFactory,但这看起来像是一把大锤,打开了其他潜在的安全问题。

最新消息:最后,我们连接的第三方也解决了这个问题。在安卓方面,我们无能为力,但我认为这是一个bios更新,它对服务器上的一些东西进行了排序,这意味着它开始以安卓可以处理的方式进行通信(我们无法从第三方获得他们做了什么的太多细节)。

最新更新