2010-03-26 4 views
2

Я пытаюсь понять, как работает SSL. В своем желании сделать небольшой FTP-клиент, который поддерживает SSL я столкнуться с некоторыми проблемами:Исходный FTP-протокол SSL с C#

TcpClient FtpConnection = new TcpClient(FtpServer, FtpPort); 
NetworkStream FtpStream = FtpConnection.GetStream(); 
StreamReader FtpReader = new StreamReader(FtpStream); 
FtpWriter = new StreamWriter(IrcStream); 
send_cmd("AUTH SSL"); 

send_cmd является просто FtpWriter.WriteLine (текст); FtpWriter.Flush(); функция.

Моя «проблема» заключается в следующем: сначала мне нужно сделать (не-ssl) соединение с FTP, а затем сказать ему сделать ssl-соединение (AUTH SSL), и я бы предположил, что мне тогда нужно сделать новое подключение - что-то вроде:

TcpClient client = new TcpClient(FtpServer, FtpPort); 
SslStream sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); 
try 
{ 
    sslStream.AuthenticateAsClient("foobar"); 
} 
catch (AuthenticationException e) 
{ 
    MessageBox.Show("Authentication failed - closing the connection."); 
    client.Close(); 
    return; 
} 

Взято из msdn. Я продолжаю умирать, когда рукопожатие потерпело неудачу из-за неожиданного формата пакета (который я пробовал искать в Google, но все говорят, что это связано с тем, что автор подключился к неправильному порту), который я принимаю как: Соединение не ssl, пока не будет отправлен AUTH SSL к нему. Итак, мой вопрос: как мне сделать это «гибридное» соединение, чтобы я мог сделать SSL-соединение с сервером?

Любая помощь очень ценится!

ответ

1

Использование подобной библиотеки является противоположностью того, что я хотел. Так как я нашел так несколько ударов при поиске в Интернете, я выложу то, что я понял: Построение C# FTP клиент в основном так:

TcpClient blabla = new TcpClient("some.host", 21); 
NetworkStream blabla_stream = blabla.GetStream(); 
StreamReader unsecure_reader = new StreamReader(blabla_stream); 
StreamWriter blabla_writer = new StreamWriter(blabla_stream); 
blabla_writer.WriteLine("AUTH SSL"); 
string response = ""; 
while ((response = unsecure_reader.ReadLine()) != null) 
{ 
    if (response.Substring(0,3) == "234") 
    { 
     SslStream ssl_connection = new SslStream(blabla.GetStream(), false, new RemoteCertificateValidationCallback(validate_certificate), null); 
     ssl_connection.AuthenticateAsClient(""); 
     StreamReader ssl_stream = new StreamReader(ssl_connection); 
     ftp_writer = new StreamWriter(ssl_connection); 
    } 
} 

где validate_certificate функция основана на MSDN (его можно Google это и легко модно).

Для получения дополнительной информации см. RFC 4217 и 2228.

 Смежные вопросы

  • Нет связанных вопросов^_^