2009-10-08 38 views
11

Piszę aplikację, która synchronizuje pliki w witrynie FTP. Obecnie działa poprzez połączenie poprzez zwykły FTP, ale teraz nasi informatycy chcą skonfigurować to za pomocą bezpiecznego połączenia FTPS.Przesyłanie plików przez FTPS (SSL/TLS) przy użyciu C# .Net

Udostępnili mi plik certyfikatu * .cr_. Jeśli otworzę plik w Notatniku, zobaczę coś takiego (ale z prawdziwymi klawiszami, oczywiście nie 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----- 

Jak mogę użyć tego pliku certyfikatu do połączenia się z serwerem FTPS w celu przesyłania i pobierania plików? Wybacz mi, ale jestem nowy w czymkolwiek, co wiąże się z przesyłaniem plików przez sieć, bezpiecznymi połączeniami, certyfikatami, kluczami publicznymi, kluczami prywatnymi, itd. ... itd.

Myślę, że chciałbym użyć FtpWebRequest obiekt i ustaw właściwość EnableSsl na true. Ale nie jestem pewien, skąd bierze się ten plik certyfikatu.

Odpowiedz

2

This article wyjaśnia, jak to zrobić, z kodem źródłowym.

Celem niniejszego artykułu jest stworzenie klienta FTP C# w trybie bezpiecznym, więc jeśli nie masz dużo wiedzy o FTPS, radzę spojrzeć na to: FTPS.

W .NET Framework, aby przesłać plik w trybie FTPS, zwykle używamy klasy FtpWebRequest, ale nie można wysyłać poleceń z argumentami cudzysłowu, a nawet jeśli wyszukujesz w Internecie, nie znajdziesz konkretnego przykład zabezpieczonego klienta C# FTP.

Z tych powodów postanowiłem stworzyć ten artykuł.

+0

Patrzę na ten artykuł i kopię kodu źródłowego. Ale nie wiem, gdzie powinienem dodać ten plik certyfikatu. –

+0

Dzięki Eric J, mam na prawdę takie samo pytanie jak oryginalny plakat i to kod, którego używam (co łączyłeś) ... wciąż próbując dowiedzieć się jak przekazać mój "hostkey" do tego kodu. – ganders

17

Jeśli używasz FtpWebRequest Class, po prostu musisz dodać kilka rzeczy do konfiguracji żądania. Pamiętaj, aby dołączyć instrukcję 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; 

Ponadto, jeśli masz problemy z wyjątków generowania certyfikatu może trzeba zaimplementować własną metodę zwrotną poprawności certyfikatu do użytku z ServicePointManager.ServerCertificateValidationCallback Property. To może być tak proste, jak zawsze zwracanie wartości true lub bardziej wyrafinowane, takie jak to, którego używam do debugowania:

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

Czy możesz wyjaśnić tę część "X509Certificate cert = X509Certificate.CreateFromCertFile (@" C: \ MyCertDir \ MyCertFile.cer ");" czy muszę mieć certyfikat lokalnie, aby uzyskać dostęp do FTPS? – Reynan

+0

@Reynan Pytanie OP o to, jak uwierzytelnić swoją aplikację kliencką na serwerze FTPS za pomocą certyfikatu, który został mu wydany i zapisany w pliku. W przypadku FTPS, w którym użytkownik jest uwierzytelniany za pomocą tylko nazwy użytkownika i hasła, nie jest to konieczne. Dla twoich celów zobacz http://stackoverflow.com/questions/9099738/upload-file-to-secured-ftp-in-asp-net. – JamieSee

Powiązane problemy