Необработанный FTP SSL с C # - PullRequest
2 голосов
/ 26 марта 2010

Я пытаюсь понять, как работает 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 (текст); 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. Я продолжаю умирать при сбое рукопожатия из-за неожиданного формата пакета (который я пробовал гуглить, но все говорят, что это потому, что автор подключился к неправильному порту), который я принимаю как: Соединение не будет ssl, пока AUTH SSL не будет отправлен Это. Итак, мой вопрос: как мне сделать это «гибридным» соединением, чтобы я мог установить SSL-соединение с сервером?

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

Ответы [ 2 ]

1 голос
/ 02 апреля 2010

Использование такой библиотеки противоположно тому, что я хотел. Поскольку при поиске в Интернете я нашел так мало обращений, я опубликую то, что выяснил: Создание клиента 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 (вы можете настроить ее и легко модифицировать).

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

0 голосов
/ 27 марта 2010

http://ftps.codeplex.com/

В этом проекте есть все, что вам нужно.

...