在C#SslStream中,会话恢复似乎不起作用

问题描述

我正在编写一个简单的应用程序以连接到SFTP服务器(端口990安全)。我使用的服务器是FileZilla服务器,版本为0.9.60。

当我尝试打开数据连接时,服务器会用

拒绝它

“数据连接的TLS会话尚未恢复或该会话与控制连接不匹配”

很好,除了Microsoft声称该会话已缓存:

框架在创建SSL会话时会对其进行缓存,并在可能的情况下尝试将缓存的会话重新用于新请求。尝试重用SSL会话时,框架会使用ClientCertificates的第一个元素(如果有),或者如果ClientCertificates为空,则尝试重用匿名会话。

MS SslStream constructor description

好吧,如果FileZilla表示它没有被重用,并且我可以在FileZilla服务器中禁用此要求以使客户端SslStream正常工作,那么我怀疑Microsoft的SslStream对象中存在某些错误。 (不建议禁用它,最终用户不太可能允许它)

也许由于服务器相同但端口号不同而没有重用它吗?

在SslStream类中找不到支持该设置的文档。

如何从控制通道上的现有流中获取“会话”,并将其分配给新的数据通道流?

我的代码片段就是这样(不全面,仅打算包含相关部分):

    private Stream Putfile(string destname) {
        FtpReply ftpreply;    //   Just a container to parse replies
        SetupDataConnection();
        ftpreply = SendCtrlCommand("STOR " + destname,false);
        m_dataSslStream = CreateSSLStream(m_dataCxn.GetStream(),false);
        return m_dataSslStream;
    }
    //  Tell the server go PASV get the connection params
    private void SetupDataConnection() {
        FtpReply ftpreply;
        ftpreply = SendCtrlCommand("PASV",false);
        IPEndPoint dataPort = ParseIPandPort(ftpreply.Reply);
        SetupPassiveConnection(dataPort);
    }
    //  create the TCP connection to the server
    private void SetupPassiveConnection(IPEndPoint endpoint) {
        CloseDataCxn();    //  If one was already open - otherwise harmless
        m_dataCxn = new TcpClient(endpoint.Address.ToString(),endpoint.Port);
        Stream s = m_dataCxn.GetStream();
        s.ReadTimeout = 120000;
        s.WriteTimeout = 120000;
    }
    //  Create the SslStream object...  Fails - The server says it need to be resuing the session from the control SslStream  
    private SslStream CreateSSLStream(Stream stream,bool leaveOpen) {
        SslStream sslStream;
        sslStream = new SslStream(stream,leaveOpen,new RemoteCertificateValidationCallback(m_userVerificationCallback),null);
        sslStream.ReadTimeout = 60000;
        sslStream.WriteTimeout = 60000;
        X509CertificateCollection x509CertCollection = new X509CertificateCollection();
        if (m_sslClientCert != null) {
            x509CertCollection.Add(m_sslClientCert);
        }
        sslStream.AuthenticateAsClient(m_hostname,x509CertCollection,SslProtocols.Default,true);
        return sslStream;
    }

任何人都可以提供一种解决方案来让SslStream像FileZilla期望的那样“重用”会话吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)