2009-10-08 24 views
11

Sto scrivendo un'applicazione che sincronizza i file su un sito FTP. In questo momento sta funzionando connettendosi tramite FTP regolare, ma ora i nostri esperti IT vogliono configurarlo tramite una connessione FTPS sicura.Trasferire file su FTPS (SSL/TLS) usando C# .Net

Mi hanno fornito un file di certificato * .cr_. Se apro il file nel blocco note, vedo qualcosa di simile a questo (ma con le chiavi reali non ovviamente foobar).

-----BEGIN RSA PRIVATE 
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR 
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
-----END RSA PRIVATE KEY----- 
-----BEGIN CERTIFICATE----- 
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
-----END CERTIFICATE----- 

Come posso usare questo file di certificato per la connessione al server FTPS per caricare e scaricare i file? Perdonami, ma sono molto nuovo a tutto ciò che riguarda il trasferimento di file su una rete, connessioni sicure, certificati, chiavi pubbliche, chiavi private, ecc ... ecc.

Penso che vorrei usare un FtpWebRequest oggetto e impostare la proprietà EnableSsl su true. Ma non sono sicuro di dove questo file di certificati entra in gioco.

risposta

2

This article spiega come farlo, con il codice sorgente.

Lo scopo di questo articolo è quello di creare un client FTP C# in modalità protetta, quindi se non si ha molta conoscenza di FTPS, si consiglia di dare un'occhiata a questo: FTPS.

In .NET Framework, per caricare un file in modalità FTPS, generalmente utilizziamo la classe FtpWebRequest, ma non è possibile inviare comandi con argomenti di preventivo, e anche se si esegue una ricerca sul Web, non si troverà un esempio di un client FTP C# protetto.

È per queste ragioni che ho deciso di creare questo articolo.

+0

Sto guardando quell'articolo e una copia del codice sorgente. Ma non riesco a capire dove aggiungerei questo file di certificato. –

+0

Grazie Eric J, ho actaully la stessa domanda del poster originale e questo è il codice che sto usando (quello che hai collegato) .... ancora cercando di capire come passare il mio "hostkey" in quel codice. – ganders

17

Se si utilizza lo FtpWebRequest Class, è sufficiente aggiungere alcune cose alla configurazione della richiesta. Assicurati di includere l'istruzione using System.Security.Cryptography.X509Certificates;.

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpUrl); 
    request.Credentials = new NetworkCredential(userName, password); 

    request.EnableSsl = true; 
    //ServicePointManager.ServerCertificateValidationCallback = ServicePointManager_ServerCertificateValidationCallback; 

    X509Certificate cert = X509Certificate.CreateFromCertFile(@"C:\MyCertDir\MyCertFile.cer"); 
    X509CertificateCollection certCollection = new X509CertificateCollection(); 
    certCollection.Add(cert); 

    request.ClientCertificates = certCollection; 

Inoltre, se si hanno problemi con le eccezioni di generazione dei certificati potrebbe essere necessario implementare il proprio metodo di callback di convalida dei certificati per l'utilizzo con il ServicePointManager.ServerCertificateValidationCallback Property. Questo può essere semplice come restituire sempre vero o essere più sofisticato come quello che uso per il debug:

public static bool ServicePointManager_ServerCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
    { 
     bool allowCertificate = true; 

     if (sslPolicyErrors != SslPolicyErrors.None) 
     { 
      Console.WriteLine("Accepting the certificate with errors:"); 
      if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateNameMismatch) == SslPolicyErrors.RemoteCertificateNameMismatch) 
      { 
       Console.WriteLine("\tThe certificate subject {0} does not match.", certificate.Subject); 
      } 

      if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateChainErrors) == SslPolicyErrors.RemoteCertificateChainErrors) 
      { 
       Console.WriteLine("\tThe certificate chain has the following errors:"); 
       foreach (X509ChainStatus chainStatus in chain.ChainStatus) 
       { 
        Console.WriteLine("\t\t{0}", chainStatus.StatusInformation); 

        if (chainStatus.Status == X509ChainStatusFlags.Revoked) 
        { 
         allowCertificate = false; 
        } 
       } 
      } 

      if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateNotAvailable) == SslPolicyErrors.RemoteCertificateNotAvailable) 
      { 
       Console.WriteLine("No certificate available."); 
       allowCertificate = false; 
      } 

      Console.WriteLine(); 
     } 

     return allowCertificate; 
    } 
+0

Puoi spiegare questa parte "X509Certificate cert = X509Certificate.CreateFromCertFile (@" C: \ MyCertDir \ MyCertFile.cer ");" ho bisogno del certificato localmente per accedere al FTPS? – Reynan

+0

@Reynan La domanda sugli OP era come autenticare la sua applicazione client sul server FTPS usando un certificato che gli era stato rilasciato e memorizzato in un file. Per FTPS in cui l'utente è autenticato tramite solo un nome utente e una password questo non è necessario. Per i tuoi scopi consulta http://stackoverflow.com/questions/9099738/upload-file-to-secured-ftp-in-asp-net. – JamieSee

Problemi correlati