“无法为 SSL/TLS 建立安全通道”在智能手机上的 .NET CF 应用程序中

Posted

技术标签:

【中文标题】“无法为 SSL/TLS 建立安全通道”在智能手机上的 .NET CF 应用程序中【英文标题】:"Could not establish secure channel for SSL/TLS" in .NET CF application on smart phone 【发布时间】:2010-11-15 05:37:07 【问题描述】:

我在 Windows Mobile 智能手机上的 .NET Compact Framework 3.5 上运行的应用程序存在顽固的通信问题。

我正在使用以下代码构建一个网络请求: UTF8Encoding encoding = new System.Text.UTF8Encoding(); byte[] Data = encoding.GetBytes(HttpUtility.ConstructQueryString(parameters)); httpRequest = WebRequest.Create((domain)) as HttpWebRequest; httpRequest.Timeout = 10000000; httpRequest.ReadWriteTimeout = 10000000; httpRequest.Credentials = CredentialCache.DefaultCredentials; httpRequest.Method = "POST"; httpRequest.ContentType = "application/x-www-form-urlencoded"; httpRequest.ContentLength = Data.Length; Stream SendReq = httpRequest.GetRequestStream(); SendReq.Write(Data, 0, Data.Length); SendReq.Close(); HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse(); return httpResponse.GetResponseStream();

Web 服务通过接收 JSON 编码的文档作为 URL 的一部分来运行(例如,https://site.com/ws/sync??document="version":"1.0.0","items":["item_1":"item1" ]&user=usr&password=pw),并作为响应接收另一个 JSON 文档作为响应数据。

此代码在所有运行 WM 5 和 6 的模拟器和 PDA 上运行良好。我们已经看到一些运行 Treo 智能手机的客户(并且仅在 Sprint 网络上)存在问题。我们已经在 AT&T 网络上的相同设备上测试了代码(通过 DeviceAnywhere),代码再次按预期工作。

这必须是手机上的某种安全策略,但我们无法确定解决方法或彻底诊断它,因为我们无法在内部重现它,不得不求助于让用户协助运行测试我们的司机。

当这段代码执行时,用户的设备会抛出以下异常:

System.Net.WebException 无法为 SSL/TLS 建立安全通道 堆栈跟踪:在 System.Net.HttpWebRequest.finishGetRequestStream() 在 System.Net.HttpWebRequest.GetRequestStream() 在 OurApp.GetResponseStream(字符串域,哈希表参数)

内部异常: System.IO.IOException 身份验证失败,因为远程方已关闭传输流。 堆栈跟踪:在 System.Net.SslConnectionState.ClientSideHandshake() 在 System.Net.SslConnectionState.PerformClientHandShake() 在 System.Net.Connection.connect(忽略对象) 在 System.Threading.ThreadPool.WorkItem.doWork(Object o) 在 System.Threading.Timer.ring()

检查服务器 Apache 日志显示没有来自用户 IP 的命中 - 我认为设备在失败之前甚至没有尝试发送数据包。 如果相关,服务器在 Linux 上运行 Apache,并使用 TurboGears Python 框架编写。

服务器证书由 CA 颁发并且仍然有效。 从中复制此错误的测试驱动程序没有代码签名,但是相同的错误(没有错误消息)是使用 GeoTrust 证书签名的,因此我们认为这不是代码签名问题。

应用程序在所有手机上安装和启动都没有问题 - 它只是建立了这个 SSL 连接,这对这些用户来说是中断的。

故障排除中的一个重要问题是,每次我们尝试解决方案时都会带来很大的不便(需要寻找“志愿者”客户),因此我们真的在寻找灵丹妙药或更好地理解握手过程,因此我们可以有理由相信我们只需要要求用户再测试一两次。

最后提一下:我们已经尝试通过 ActiveSync 和 GPRS 进行同步,结果相同。

任何想法将不胜感激!

【问题讨论】:

您是否记得您为解决此问题所做的工作? 【参考方案1】:

我在 Tomcat 服务器上遇到了同样的问题。

在我的 Tomcat 连接器 (server.xml) 中使用 SSLProtocol="all" 后它消失了。

我被使用 SSLProtocol="TLSv1" 的 Tomcat SSL How-To 误导了。该值适用于移动设备上的 IE,但不适用于我的 .Net Compact Framework 3.5 应用程序。

【讨论】:

以上是关于“无法为 SSL/TLS 建立安全通道”在智能手机上的 .NET CF 应用程序中的主要内容,如果未能解决你的问题,请参考以下文章

翻盖智能语音王 金立GN777智能手机评测

我需要创建一个可以在所有智能手机上运行的智能手机应用程序,我该怎么做?

Android系统智能手机如何应用拖到桌面

手机控车OBD-移动管家手机控车方案基于Android手机智能控制汽车系统的研究与实现;

通过大数据对智能手机市场消费情况分析

浅谈:中国式设计智能手机有望引领未来