使用 StreamSocket 升级到 SSL

Posted

技术标签:

【中文标题】使用 StreamSocket 升级到 SSL【英文标题】:Upgrade to SSL using StreamSocket 【发布时间】:2012-06-15 07:51:12 【问题描述】:

我正在开发 WinRT(Windows8 Release Preview)。我有一个 Web 应用程序(实际上是一个更简单的 XMPP 客户端)。

我主要使用 StreamSocket 类来连接 Jabber Server。它给了我一个好的开始。但是当我尝试升级已经连接的套接字以使用 SSL 时遇到了一个问题。

我使用StreamSocket.UpgradeToSslAsync 来实现它。它会抛出这样的异常

在意外的时间调用了一个方法。 (HRESULT 的例外情况: 0x8000000E)

我不知道为什么会这样。我已经完成了上面链接的所有事情。我已经创建成功连接的套接字。我可以从 Jabber 服务器接收一些 xml 节。 这是运行时的图片![在此处输入图片描述][1]

你可以在new tab看到图片。

当我单击 UpToSSL 按钮时,它会崩溃并抛出上述异常。

这里是更简单的版本代码:

 // xmpp is my  CXMPP  client class
 private void StartTlsBtn_Click(object sender, RoutedEventArgs e)
 
   xmpp.SendXml("<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls' />");            
  
 // it works fine, and i have got the reponse from server:
 //     <proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
 // next step i should upgrade my sockey connection to ssl

    private void UpSslBtn_Click(object sender, RoutedEventArgs e)
    
      xmpp.UpToSsl();         
    

    async public void UpToSsl()
    
        SendEvent.WaitOne();
        SendEvent.Reset();

        // private StreamSocket ClientSock;
        await ClientSock.UpgradeToSslAsync(SocketProtectionLevel.Ssl, ClientSock.Information.RemoteHostName);
        isSsl = true;
        SendEvent.Set();
      

请给我一些建议。谢谢。

【问题讨论】:

您尝试过使用 ConnectAsync 连接吗?如果您展示了如何创建套接字并在文档的备注部分中实现这些步骤,将会有所帮助。 是的,实际上我使用的是 MSDN 所说的 ConnectAsync。 【参考方案1】:

我也在为 Metro 开发 XMPP 应用程序,服务器连接和协议解析器已准备就绪。

我正在使用三个 ManualResetEvents,因此 Send、Receive 和 Elevate 不会发生冲突。还要小心,因为 UpgradeToSslAsync 不接受自签名证书,在这种情况下会抛出异常。

我真的很想进一步帮助你,但我试图用这个来资助自己,XMPP 库将在应用程序发布到商店后发布

【讨论】:

还是谢谢大家。你的意思是我的问题是由我的本地证书引起的吗?你能给我一些提示或关键词吗? 异常是因为正在进行读取或写入,我先关闭我的DataReader和DataWriter,然后我尝试提升,无效证书的异常看起来不同 Paul,你是对的,如果我在启动接收线程之前使用 UpgradeToSslAsync,它运行良好。这意味着这个功能可以工作。 保罗,你是对的。如果我在启动接收线程之前使用 UpgradeToSslAsync,它运行良好。这意味着这个功能可以工作。它是由读写事件引起的。我在后台运行一个接收线程(它永远不会停止)。我使用 ManualResetEvents ReceiveEvent 来确保它不会与其他操作发生冲突。但如果网络中没有数据,则不会设置 ReceiveEvent。在这种情况下,一些正在等待这个信号量的操作会阻塞在那里。我的 UpToSsl() 现在就是这种情况的一个例子。

以上是关于使用 StreamSocket 升级到 SSL的主要内容,如果未能解决你的问题,请参考以下文章

StreamSocket

Windows8 Metro界面下的StreamSocket 发送数据与接收数据

如何在 StreamSocket 的 ConnectAsync() 上设置超时值?

处理 WebSocket 服务器端

颤振流套接字

epoll中的各种参数