2009-10-22 7 views
5

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.

+1

Następnie opublikuj swoją odpowiedź jako odpowiedź i zaakceptuj ją. –

Odpowiedz

1

Czy sprawdziłeś, czy Twój host używa protokołu FTPS lub SFTP?

są to różne protokoły i Twój komputer mógł zakładać, że mówiłeś o niewłaściwym.

+0

Dzięki za odpowiedź. Pracowałem w firmie hostingowej i problem został rozwiązany. Okazało się, że jest to pewne ustawienie w ich otoczeniu. – mosu

+0

^Czy Twoim środowiskiem hostingowym byłaby usługa hostingu chmur typu cloud EC2? – D3vtr0n

Powiązane problemy