2009-10-22 14 views
5

Ho implementato la mia classe FTP personalizzata per funzionare con un server ospitato per il quale sto pagando. Uso l'FTP per il backup, il ripristino e l'aggiornamento della mia applicazione. Sono ora nel momento in cui voglio abilitare lo ssl a metterlo in produzione. Ho chiesto alla mia società di hosting se supportano il protocollo SSL e hanno detto che lo fanno.FtpWebRequest con EnableSSL

Così ho modificato i miei metodi dopo Microsoft MSDN tutorial per qualcosa di simile:

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; 

Ora, la MSDN dice che se il server supporta il protocollo SSL non getterà ed eccezione quando gli viene chiesto con AUTH TLS. Questo può essere visto nel registro di traccia. Quindi suppongo che non sia un problema del server.

Dopo la fase di autenticazione il server restituisce un messaggio

System.Net Information: 0 : [0216] FtpControlStream#41622463 - Received response [227 Entering Passive Mode (the IP and port number).]

che fa scattare un errore:

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).

Ho provato a impostare la proprietà

reqFTP.UsePassive = true; 

false e allora ottengo questo errore:

System.Net Information: 0 : [2692] FtpControlStream#4878312 - Received response [500 Illegal PORT command]

Ovviamente, senza la proprietà EnableSLL impostata su true, tutto funziona senza problemi.

Qualcuno ha qualche idea su questo?

Edit: ho modificato il codice come Fallows:

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; 

Il ValidateServerCertificate restituisce sempre vero. Dopo queste modifiche l'effetto è nessuno.

E non capisco:

  • In questo momento l'applicazione utilizza il certificato del server, giusto?
  • E prima che le modifiche usassero anche il mio?

Qualcuno può spiegare come funziona?

Modifica: Dopo molte e-mail scambiate con la società di hosting si è scoperto che avevano problemi con il loro software FTP e non era un problema con il codice.

+1

Quindi postare la modifica come risposta e accettarla. –

risposta

1

Hai controllato se l'host utilizza FTPS o SFTP?

sono protocolli diversi e il tuo host potrebbe aver pensato che stavi parlando di quello sbagliato.

+0

Grazie per la risposta. Ho lavorato insieme alla società di hosting e il problema è stato risolto. Risultò essere l'impostazione del loro ambiente. – mosu

+0

^Il tuo ambiente di hosting potrebbe essere il cloud hosting EC2 Amazon? – D3vtr0n

Problemi correlati