Я реализовал свой собственный класс 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, и с кодом не было никаких проблем.