“无法为 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 应用程序中的主要内容,如果未能解决你的问题,请参考以下文章
我需要创建一个可以在所有智能手机上运行的智能手机应用程序,我该怎么做?