FtpWebRequest с EnableSSL - PullRequest
       18

FtpWebRequest с EnableSSL

5 голосов
/ 22 октября 2009

Я реализовал свой собственный класс FTP для работы с размещенным сервером, за который я плачу. Я использую FTP для резервного копирования, восстановления и обновления моего приложения. Сейчас я нахожусь в момент, когда я хочу включить ssl для запуска в производство. Я спросил мою хостинговую компанию, поддерживают ли они протокол ssl, и они ответили, что поддерживают.

Поэтому я изменил свои методы после учебника по Microsoft MSDN примерно так:

reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(m_ftpAddress.Trim()));
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(m_ftpUsername, m_ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(ValidateServerCertificate);
                X509Certificate cert = new X509Certificate(path to a certificate created with makecert.exe);

reqFTP.ClientCertificates.Add(cert);
reqFTP.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested;
reqFTP.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Identification;

reqFTP.EnableSsl = true;

Теперь MSDN сообщает, что если сервер поддерживает протокол ssl, он не будет выдавать исключение при запросе с AUTH TLS. Это можно увидеть в журнале трассировки. Поэтому я полагаю, что это не проблема сервера.

После фазы аутентификации сервер возвращает

Информация System.Net: 0: [0216] FtpControlStream # 41622463 - Получен ответ [227 Вход в пассивный режим (IP и номер порта).]

сообщение, которое вызывает ошибку:

Ошибка System.Net: 0: [0216] Исключение в FtpWebRequest # 12547953 :: GetResponse - Удаленный сервер возвратил ошибку: 227 Вход в пассивный режим (IP и номер порта).

Я попытался установить

reqFTP.UsePassive = true;

свойство ложно, и тогда я получаю эту ошибку:

Информация о System.Net: 0: [2692] FtpControlStream # 4878312 - Получен ответ [500 Недопустимая команда PORT]

Конечно, без свойства EnableSLL, установленного в true, все работает без проблем.

У кого-нибудь есть идеи по этому поводу?

Редактировать: Я изменил код следующим образом:

reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(m_ftpAddress.Trim()));
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(m_ftpUsername, m_ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;

ServicePointManager.ServerCertificateValidationCallback = new       
     System.Net.Security.RemoteCertificateValidationCallback(ValidateServerCertificate);

reqFTP.ClientCertificates.Add(cert);
reqFTP.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested;
reqFTP.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Identification
reqFTP.EnableSsl = true;

ValidateServerCertificate всегда возвращает true . После этой модификации эффекта нет.

И я не понимаю:

  • В данный момент приложение использует сертификат сервера, верно?
  • А до модификаций пользовался и мой?

Может кто-нибудь объяснить, как это работает?

Редактировать: После того, как многие хостинги обменялись электронными письмами, выяснилось, что у них были проблемы с программным обеспечением FTP, и с кодом не было никаких проблем.

1 Ответ

1 голос
/ 12 ноября 2010

Вы проверили, использует ли ваш хост FTPS или SFTP?

это разные протоколы, и ваш хост мог предположить, что вы говорите не о том.

...