не удалось подключиться к FileZilla после включения SSL в FTPWebrequest

Я пытался использовать SSL в ftpwebrequest, как показано ниже.

  FileStream outputStream = new FileStream(fileName, FileMode.Append);
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpserverIp + "/" + file));
           reqFTP.EnableSsl = true;
            reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
            reqFTP.UseBinary = true;
            reqFTP.KeepAlive = false;
            reqFTP.Timeout = -1;
            reqFTP.UsePassive = true;
            reqFTP.Credentials = new NetworkCredential("sh", "SE");
            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
            Stream ftpStream = response.GetResponseStream();
            long cl = response.ContentLength;
            // reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
            int bufferSize = 4096;
            int readCount;
            byte[] buffer = new byte[bufferSize];
            readCount = ftpStream.Read(buffer, 0, bufferSize);
            Console.WriteLine("Connected: Downloading File");
            while (readCount > 0)
            {
                outputStream.Write(buffer, 0, readCount);
                readCount = ftpStream.Read(buffer, 0, bufferSize);
                //Console.WriteLine(readCount.ToString());
            }

            ftpStream.Close();
            outputStream.Close();
            response.Close();

Я получил это исключение ниже:

Удаленный сертификат недействителен в соответствии с процедурой проверки.

Основываясь на моем Google, удалите часть закрытого ключа в сертификате и начните обработку, теперь он выдает

431 не удалось инициализировать SSL-соединение

Я пробовал гуглить, но пока безрезультатно, есть идеи, ребята.

Пытаюсь подключить FileZilla.


person Usher    schedule 21.02.2012    source источник


Ответы (3)


Ответ прост: FtpWebRequest даже недостаточно хорошо поддерживает FTPS.

Цитата из http://ftps.codeplex.com/

Класс System.Net.FTPWebRequest, предоставляемый .Net Framework, идеально подходит для простых задач (например, загрузка или выгрузка файла или получение списка каталогов) и также поддерживает SSL через свойство EnableSsl См.: http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx . Так зачем для этого новый класс?

Дело в том, что поддержка SSL в FTP — это больше, чем просто включение/выключение (как в HTTP/HTTPS). FTP требует двух отдельных соединений: одно для команд (управляющее соединение) и одно для данных (соединение для данных), для загрузки, выгрузки и списков каталогов. FTPWebRequest.EnableSsl просто заставляет использовать SSL на обоих из них. Проблема в том, что это не всегда подходит.

Microsoft начинает поддерживать FTPS на стороне сервера только тогда, когда они предоставляют FTP 7.5 для Windows Server 2008 и выше. До сих пор они даже не поддерживали FTPS ни в Internet Explorer, ни в Windows Explorer. Неудивительно, что в .NET Framework BCL отсутствует поддержка FTPS.

person Lex Li    schedule 22.02.2012
comment
, не могли бы вы исправить меня, в этом случае я не могу использовать SSL? Если я хочу включить SSL, то как я могу вызвать ftp-сервер (я имею в виду URI)? точно так же, как ftp? - person Usher; 22.02.2012
comment
Просто добавил несколько цитат. Вы можете перейти на blogs.msdn.com/b/ adarshk/archive/2005/04/22/410925.aspx, чтобы узнать, как правильно обращаться с сертификатом самостоятельно. - person Lex Li; 22.02.2012

В этом сегменте кода: new Uri("ftp://" + ftpserverIp + "/" + file) вы пытаетесь подключиться к ftp-серверу, не поддерживающему SSL, который обозначается как "ftp". Изменение «ftp://» на «ftps://» должно помочь (при условии, что сервер поддерживает SSL).

person Matt T    schedule 22.02.2012
comment
, я пытался использовать ftps, он сразу бросает Префикс URI не распознан. - person Usher; 22.02.2012
comment
Хм... ну, немного погуглил: forum. filezilla-project.org/viewtopic.php?f=2&t=11545 — надеюсь, это поможет. - person Matt T; 22.02.2012
comment
Еще раз спасибо @Matt T, основываясь на предложении, предоставленном URL-адресом, изменил мой URL-адрес, например FTPES:// + ftpserverIp + / + файл), но выдает Префикс URI не распознан. сразу - person Usher; 22.02.2012

Шаг, который вы упускаете, — это установка политики проверки сертификата.

Это делается с помощью следующего кода:

public static bool ValidateCertificate(object sender,
                       X509Certificate certificate, X509Chain chain,
                       SslPolicyErrors sslPolicyErrors) {
   /**
    * validation steps for the certificate go here
    * if you want them, but it may be expedient to 
    * just accept whatever the FTP server gave you.
    * The channel will be encrypted regardless of
    * how trusted the certificate is.
    */
    return true;
}

а затем установите указанный выше метод для запуска при проверке сертификата:

ServicePointManager.ServerCertificateValidationCallback = 
    new RemoteCertificateValidationCallback(ValidateCertificate);

Данный пример работает в .NET 3.5, что означает, что на момент принятого в настоящее время ответа утверждение о том, что эта настройка невозможна, уже было неверным.

person GunnerGuyven    schedule 13.01.2014