【发布时间】: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 警报。"
-
同样的问题,你有没有找到可行的解决方案?