【问题标题】:FTPS Server using .NET SslStream使用 .NET SslStream 的 FTPS 服务器
【发布时间】:2013-04-02 08:24:33
【问题描述】:

我正在用 C# 开发一个 FTP 服务器,我刚刚使用 SslStream 类完成了 FTPS 显式模式功能的实现,一切正常。

我在使用 fileZilla > 3.0.11 作为客户端时遇到问题。我用谷歌搜索,似乎sslstream 实现没有正确关闭连接。 (不发送close_notify 警报)。使用 WinScp、SmartFTP 和 lftp 一切正常。

有任何想法或任何其他 SSL 库吗?

或者用某种方法硬编码close_notify 警报并发送它?

具体的代码示例会很棒!

创建 sslStream:

_sslStream = new SslStream(socket.GetStream());      
var _cert = new X509Certificate2(certPath,pass);    
_sslStream.AuthenticateAsServer(_cert);

关闭连接:

_sslStream.Close();
socket.Close();
_sslStream = null;
socket = null;

FileZilla 3.6.0.2 错误日志:

Response:   150 Opening data connection for LIST
Trace:  CFtpControlSocket::TransferParseResponse()
Trace:    code = 1
Trace:    state = 4
Trace:  CFtpControlSocket::SendNextCommand()
Trace:  CFtpControlSocket::TransferSend()
Trace:    state = 5
Trace:  CTlsSocket::OnRead()
Trace:  CTlsSocket::ContinueHandshake()
Trace:  TLS Handshake successful
Trace:  TLS Session resumed
Trace:  Cipher: AES-128-CBC, MAC: SHA1
Trace:  CTransferSocket::OnConnect
Trace:  CTransferSocket::OnReceive(), m_transferMode=0
Trace:  CTlsSocket::Failure(-110, 0)
Error:  GnuTLS error -110 in gnutls_record_recv: The TLS connection was non-properly terminated.
Error:  Could not read from transfer socket: ECONNABORTED - Connection aborted
Trace:  CTransferSocket::TransferEnd(3)
Trace:  CFtpControlSocket::TransferEnd()
Trace:  CTlsSocket::OnRead()
Trace:  CFtpControlSocket::OnReceive()
Response:   226 LIST successful.

【问题讨论】:

  • 你是如何关闭蒸汽的?请出示您的代码。
  • 我刚刚回忆起 - 我在实施我们的 FTPS 服务器时遇到了与 Filezilla 相同的问题。通过修复 SSL 类解决了这个问题,但是您没有使用 SSL 流的选择。所以你可以 1) 忽略 Filezilla 2) 向 GnuTLS 提交一个补丁,它将忽略这个错误:) 3) 在 Microsoft 论坛的某个地方打开一个案例 - 这种行为不符合标准,因为 RFC 明确要求“每一方都必须发送在关闭连接的写入端之前发出 close_notify 警报。"
  • 同样的问题,你有没有找到可行的解决方案?

标签: c# .net ssl ftps


【解决方案1】:

我认为,您有真正的理由重新发明轮子。已经有在 C#/.NET 中实现 FTPS 服务器的库,例如 SecureBlackbox(不过,它是商业的)。

【讨论】:

  • 谢谢!。无论如何,你知道任何免费图书馆吗?
  • 对于 FTPS 服务器 - 不幸的是,没有。但是对于 SSL/TLS 的东西,有 BouncyCastle 库 - 免费和开源。
  • @Morvader SecureBlackbox 提供 SSL/TLS 层(比 BouncyCastle 更灵活、更强大)和两个 FTPS 服务器组件(低级组件和高级组件)。
  • 任何关于使用 BouncyCastle 进行安全 FTP 连接的代码示例?谢谢。
  • 对不起,没有例子。但是,您可以下载 SecureBlackbox 并从盒子中获得一个有效的 FTPS 服务器演示。
【解决方案2】:

请查看我发布的解决方法 here。如果我们能共同改进这个解决方法,那就太好了。

【讨论】:

    【解决方案3】:

    如果在关闭 Socket 之前调用 Shutdown 会发生什么?

    socket.Shutdown(SocketShutdown.Both);
    

    【讨论】:

      【解决方案4】:

      怎么样

      _sslStream.Dispose();
      

      我想知道 Dispose 方法是否处理 close_notify

      【讨论】:

      • 没有解决问题:(。谢谢!
      猜你喜欢
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 2011-10-14
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 2020-06-12
      相关资源
      最近更新 更多