2013-04-02 20 views
5

Sto sviluppando un server FTP in C#, ho appena finito di implementare la funzionalità in modalità esplicita FTPS usando la classe SslStream e tutto va quasi bene.FTPS Server using .NET SslStream

Ho problemi con fileZilla> 3.0.11 come client. I google arround e sembra che l'implementazione sslstream non chiuda la connessione correttamente. (non inviare l'avviso close_notify). L'utilizzo di WinScp, SmartFTP e lftp everithing funziona perfettamente.

Qualche idea o altra libreria SSL?

O forse un modo per codificare l'allarme close_notify e inviarlo?

Un esempio di codice concreto sarebbe fantastico!

Creazione SslStream:

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

connessioni di chiusura: registro

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

FileZilla 3.6.0.2 Errore:

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

Come stai chiudendo il vapore? Si prega di mostrare il codice. – Polyfun

+1

Ho appena richiamato - Ho avuto lo stesso problema con Filezilla quando implementava il nostro server FTPS. Risolto risolvendo le classi SSL, tuttavia non hai questa scelta con lo streaming SSL. Quindi puoi 1) ignorare Filezilla 2) Invia una patch a GnuTLS che ignorerà questo errore :) 3) Apri una custodia da qualche parte nei forum Microsoft - questo comportamento non è conforme allo standard, poiché RFC richiede chiaramente "Ogni parte è richiesta per inviare un avviso close_notify prima di chiudere il lato di scrittura della connessione. " –

+0

Lo stesso problema qui, hai mai trovato una soluzione funzionante? –

risposta

5

penso, voi hanno un vero e proprio motivo di reinventare la ruota. Esistono già delle librerie che implementano il server FTPS in C# /. NET, come SecureBlackbox (tuttavia, è commerciale).

+0

Grazie !. Ad ogni modo, conosci qualche biblioteca gratuita? – Morvader

+0

Per il server FTPS - sfortunatamente no. Ma per roba SSL/TLS c'è la libreria BouncyCastle - gratuita e open-source. –

+0

@Morvader SecureBlackbox offre sia il livello SSL/TLS (molto più flessibile e potente di BouncyCastle) sia due componenti server FTPS (componente di basso livello e uno di alto livello). –

0

Cosa succede se si chiama Shutdown sulla presa prima di chiuderla?

socket.Shutdown(SocketShutdown.Both); 
+0

Stesso errore :(.Grazie per l'aiuto! – Morvader

0

Come su

_sslStream.Dispose(); 

Mi chiedo se il metodo Dispose gestisce il close_notify.

+0

Non risolvere il problema :(. Grazie! – Morvader

3

Si prega di dare un'occhiata a una soluzione che ho postato here. Sarebbe bello se tutti insieme potessimo migliorare questo workaround.

Problemi correlati