使用 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的主要内容,如果未能解决你的问题,请参考以下文章
Windows8 Metro界面下的StreamSocket 发送数据与接收数据