Необработанный FTP SSL с C#

Я пытаюсь понять, как работает SSL. Желая создать небольшой FTP-клиент с поддержкой SSL, я столкнулся с некоторыми проблемами:

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(text); 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;
}

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

Любая помощь приветствуется!


person Chuck    schedule 26.03.2010    source источник


Ответы (2)


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

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 (вы можете легко погуглить и модифицировать ее самостоятельно).

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

person Chuck    schedule 01.04.2010

http://ftps.codeplex.com/

Этот проект содержит все части, которые вам нужны.

person Lex Li    schedule 27.03.2010