代码之家  ›  专栏  ›  技术社区  ›  Stefan Mohr

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

  •  3
  • Stefan Mohr  · 技术社区  · 15 年前

    我遇到了一个棘手的通信问题,这个应用程序运行在Windows Mobile智能手机上的.NET Compact Framework 3.5上。

    我正在使用以下代码构造web请求:

    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和WM 6的所有模拟器和pda上运行良好。我们已经看到一些客户在运行Treo智能手机时出现了问题(而且只在Sprint网络上)。我们已经在AT&T网络上的同一设备上(通过DeviceAnywhere)测试了代码,并且代码再次按预期工作。

    这在电话上肯定是某种安全策略,但我们一直无法确定解决方法或彻底诊断,因为我们无法在内部复制它,不得不求助于让用户帮助我们运行测试驱动程序。

    执行此代码时,用户的设备引发以下异常:

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

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

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

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

    该应用程序在所有手机上安装和启动都没有问题—它只是为这些用户建立了中断的SSL连接。

    故障排除中的一个重要问题是,每次我们尝试解决方案时都会带来很大的不便(需要找到一个“志愿者”客户),因此我们确实在寻找一个银弹,或者更好地理解握手过程,这样我们就可以合理地确信我们只需要让用户再测试一两次。

    最后一点:我们已经尝试了通过ActiveSync和GPRS同步,结果完全相同。

    任何想法都将不胜感激!

    1 回复  |  直到 15 年前
        1
  •  0
  •   pierrant    11 年前

    我对Tomcat服务器也有同样的问题。

    在Tomcat连接器(server.xml)中使用SSLProtocol=“all”之后,它就消失了。

    我被Tomcat SSL误导了如何使用SSLProtocol=“TLSv1”。这个值对于移动设备上的IE来说很好,但对于我的.Net Compact Framework 3.5应用程序来说不是。