2013-04-02 34 views
5

Zajmuję się tworzeniem serwera FTP w języku C#, właśnie skończyłem wdrażanie funkcji trybu jawnego FTPS przy użyciu klasy SslStream i wszystko idzie prawie w porządku.Serwer FTPS używający .NET SslStream

Mam problemy z używaniem plikuZilla> 3.0.11 jako klienta. Mam google arround, i wydaje się, że implementacja sslstream nie zamyka poprawnie połączenia. (nie wysyłając alertu close_notify). Korzystanie z WinScp, SmartFTP i everfting lftp działa dobrze.

Wszelkie pomysły lub jakakolwiek inna biblioteka SSL?

A może jakiś sposób na zakodowanie ostrzeżenia close_notify i wysłanie go?

Przykładowy kod przykładowy byłby świetny!

Tworzenie SslStream:

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

połączenia zamknięciem: log

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

FileZilla 3.6.0.2 Błąd:

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

Jak zamykasz parę? Proszę pokazać swój kod. – Polyfun

+1

Właśnie przypomniałem - miałem ten sam problem z Filezillą, kiedy wdrażał nasz serwer FTPS. Rozwiązał go, modyfikując klasy SSL, jednak nie masz tego wyboru przy użyciu strumienia SSL. Więc możesz 1) zignorować Filezillę 2) Prześlij łatkę do GnuTLS, która zignoruje ten błąd :) 3) Otwórz skrzynkę gdzieś na forach Microsoftu - to zachowanie nie jest zgodne ze standardem, ponieważ RFC wyraźnie wymaga "Każda strona jest wymagana do wysłania a close_notify alert przed zamknięciem strony zapisu połączenia. " –

+0

Ten sam problem tutaj, czy kiedykolwiek znalazłeś działające rozwiązanie? –

Odpowiedz

5

myślę, że masz prawdziwy powód do wymyślać Koło. Istnieją już biblioteki, które implementują serwer FTPS w C#/.NET, na przykład SecureBlackbox (jednak jest to reklama komercyjna).

+0

Dzięki !. Tak czy inaczej, znasz jakąś wolną bibliotekę? – Morvader

+0

Dla serwera FTPS - niestety nie. Ale w przypadku SSL/TLS istnieje biblioteka BouncyCastle - bezpłatna i open-source. –

+0

@Morvader SecureBlackbox oferuje zarówno warstwę SSL/TLS (o wiele bardziej elastyczną i wydajniejszą niż BouncyCastle), jak i dwa składniki serwera FTPS (komponent niskopoziomowy i wysokopoziomowy). –

0

Co się stanie, jeśli wywołasz Shutdown na gnieździe przed zamknięciem?

socket.Shutdown(SocketShutdown.Both); 
+0

Ten sam błąd :(. Dziękujemy za pomoc! – Morvader

0

Jak o

_sslStream.Dispose(); 

Zastanawiam się czy metoda Dispose obsługuje close_notify.

+0

Nie rozwiązuje problemu :(. Dzięki! – Morvader

3

Proszę spojrzeć na obejście, które opublikowałem here. Byłoby wspaniale, gdybyśmy wszyscy razem mogli ulepszyć to obejście.

Powiązane problemy