2013-04-02 51 views
5

Ich entwickle einen FTP-Server in C#, ich habe gerade FTPS expliziten Modus Funktionalität implementiert mit SslStream Klasse und alles geht fast in Ordnung.FTPS Server mit .NET SslStream

Ich habe Probleme mit fileZilla> 3.0.11 als Client. Ich google arround, und es scheint, dass sslstream Implementierung die Verbindung nicht ordnungsgemäß schließt. (keine close_notify Warnung senden). Mit WinScp funktioniert SmartFTP und lftp everithing gut.

Irgendwelche Ideen oder andere SSL-Bibliothek?

Oder vielleicht eine Möglichkeit, die close_notify Warnung fest zu kodieren und senden Sie es?

Konkrete Codebeispiel wäre toll!

Erstellen SslStream:

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

Schluss Verbindungen:

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

FileZilla 3.6.0.2 Fehlerprotokoll:

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. 
+0

Wie schließen Sie den Dampf? Bitte zeigen Sie Ihren Code. – Polyfun

+1

Ich erinnerte mich gerade - ich hatte dasselbe Problem mit Filezilla, als wir unseren FTPS-Server implementiert haben. Sie haben es gelöst, indem Sie SSL-Klassen repariert haben, aber Sie haben keine Möglichkeit, den SSL-Stream zu verwenden. So können Sie 1) Filezilla ignorieren 2) einen Patch an GnuTLS senden, der diesen Fehler ignoriert :) 3) Öffnen Sie einen Fall irgendwo in Microsoft-Foren - dieses Verhalten ist nicht standardkonform, da RFC eindeutig erfordert "Jede Partei muss senden ein close_notify-Alarm vor dem Schließen der Schreibseite der Verbindung. " –

+0

Das gleiche Problem hier, hast du jemals eine funktionierende Lösung gefunden? –

Antwort

5

Ich glaube, Sie haben einen besonderen Grund neu zu erfinden das Rad. Es gibt bereits Bibliotheken, die FTPS-Server in C# /. NET implementieren, wie SecureBlackbox (es ist jedoch kommerziell).

+0

Danke !. Wie auch immer, kennst du eine freie Bibliothek? – Morvader

+0

Für FTPS Server - leider nein. Aber für SSL/TLS-Sachen gibt es eine BouncyCastle-Bibliothek - kostenlos und Open-Source. –

+0

@Morvader SecureBlackbox bietet sowohl SSL/TLS-Layer (viel flexibler und leistungsfähiger als BouncyCastle) als auch zwei FTPS-Server-Komponenten (Low-Level-Komponente und High-Level-Komponente). –

0

Was passiert, wenn Sie vor dem Schließen Shutdown auf dem Socket aufrufen?

socket.Shutdown(SocketShutdown.Both); 
+0

Gleicher Fehler :(. Danke für die Hilfe! – Morvader

0

Wie wäre es

_sslStream.Dispose(); 

Ich frage mich, ob die Dispose-Methode die close_notify behandelt.

+0

Nicht das Problem zu lösen :(. Danke! – Morvader

3

Bitte sehen Sie sich einen Workaround an, den ich veröffentlicht habe here. Es wäre großartig, wenn wir alle zusammen diese Umgehung besser machen könnten.