Zaimplementowałem moją niestandardową klasę FTP do pracy z hostowanym serwerem, za który płacę. Używam FTP do tworzenia kopii zapasowych, przywracania i aktualizacji mojej aplikacji. Jestem teraz w momencie, w którym chcę włączyć ssl, aby umieścić to w produkcji. Zapytałem moją firmę hostingową, czy obsługują protokół ssl i powiedzieli, że tak.FtpWebRequest z EnableSSL
Więc zmodyfikowane moje metody po tutorialu Microsoft MSDN, aby coś takiego:
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;
Teraz MSDN mówi, że jeśli serwer obsługuje protokół SSL nie rzuci i wyjątek pytany o AUTH TLS. Można to zobaczyć w dzienniku śledzenia. Więc przypuszczam, że to nie jest problem z serwerem.
Po fazie uwierzytelniania serwer zwraca
System.Net Information: 0 : [0216] FtpControlStream#41622463 - Received response [227 Entering Passive Mode (the IP and port number).]
wiadomość, która wyzwala błąd:
System.Net Error: 0 : [0216] Exception in the FtpWebRequest#12547953::GetResponse - The remote server returned an error: 227 Entering Passive Mode (the IP and port number).
Próbowałem ustawiać właściwość false
reqFTP.UsePassive = true;
a potem dostać ten błąd:
System.Net Information: 0 : [2692] FtpControlStream#4878312 - Received response [500 Illegal PORT command]
Oczywiście bez właściwości EnableSLL ustawionej na true wszystko działa bez problemów.
Czy ktoś ma jakiś pomysł na ten temat?
Edit: I zmodyfikowany kod w sposób następujący:
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
zawsze zwraca prawdziwą. Po tych modyfikacjach efekt nie występuje.
A ja nie rozumiem:
- W tej chwili aplikacja jest przy użyciu certyfikatu serwera, prawda?
- I zanim modyfikacje również korzystały z moich?
Czy ktoś może mi wyjaśnić, jak to działa?
Edit: Po wielu e-maile wymieniane z firmą hostingową, okazało się, że mieli problemy z ich oprogramowania FTP i nie było problemu z kodem.
Następnie opublikuj swoją odpowiedź jako odpowiedź i zaakceptuj ją. –