加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – .NET SslStream无效

发布时间:2020-12-15 21:14:19 所属栏目:百科 来源:网络整理
导读:我正在尝试使用.net SslStream对tls隧道进行初始化,但在打开流之后我总是得到以下错误: “无法从传输连接中读取数据:已建立的连接已被主机中的软件中止.” 建立tls连接后,发送第二条消息后. 我一直在寻找过去四天的答案,但网上没有任何有用的信息! 编辑:
我正在尝试使用.net SslStream对tls隧道进行初始化,但在打开流之后我总是得到以下错误:

“无法从传输连接中读取数据:已建立的连接已被主机中的软件中止.”

建立tls连接后,发送第二条消息后.

我一直在寻找过去四天的答案,但网上没有任何有用的信息!

编辑:
我正在尝试连接到talk.google.com

我正在使用MSDN的代码示例.唯一的区别是我在使用tls之前和之后发送数据我执行以下操作:

public void SecureStream()
        {
        netStream.Flush();
        sslStream = new SslStream(netStream,false,new RemoteCertificateValidationCallback(ValidateServerCertificate),null);

    sslStream.AuthenticateAsClient("talk.google.com");}

编辑:我设法消除了第一个错误(关于我如何处理发送的小错误)现在我总是得到

“无法从传输连接中读取数据:已建立的连接已被主机中的软件中止.”

edit2:我没有发送任何空格我重写了消息传递部分,我仍然有同样的问题.

我开始

String streamInit = "<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' to='google.com' version='1.0'>";
        client.Send(streamInit);

然后收到我有以下

static void client_MessageReceived(SyncronousClient source,string Result)
    {


        if (Regex.IsMatch(Result,"<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"><required/></starttls>"))
        {
            String startTlS = "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>";
            source.Send(startTlS);

        }
        else if (Regex.IsMatch(Result,"<proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>"))
        {
            //Do TLS Magic 
            source.SecureStream();
            String streamReInit = "<stream:stream xmlns='jabber:client'xmlns:stream='http://etherx.jabber.org/streams'to='google.com'version='1.0'>";
            source.Send(streamReInit);
        }
        else if (Regex.IsMatch(Result,"<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">"))
        {
            //String AuthType = "<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='X-GOOGLE-TOKEN'/>";
            String AuthType = "<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="PLAIN"/>";
            source.Send(AuthType);
        }}

解决方法

这不太可能是您的问题(除非.Net已经开始在SNI下开展),但是当您调用AuthenticateAsClient时,请传入您在流属性中使用的相同域名(在本例中为google.com).同样,您可能需要gmail.com而不是google.com:

sslStream.AuthenticateAsClient("gmail.com",null,SslProtocols.Tls,false);

正如csharptest.net所提到的那样,确保你没有发送额外空格的keepalive计时器,或等到TLS工作之后才启动计时器.我可以想象你得到这个错误的唯一另一种方法是,如果你没有服务器实现的密码套件,但我知道.Net SslStream可以对抗GTalk.

最后,使用现有的.Net库中的一个用于XMPP(有5个列出的here),您可以立即开始编写更多有趣的代码.您将要遇到.Net XML系统的不足之处,当您在单次读取中开始获取部分节或多个节时,基于正则表达式的方法将无法工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读