2009-10-08 28 views
11

Tôi đang viết một ứng dụng đồng bộ hóa các tệp trên một trang FTP. Ngay bây giờ nó hoạt động bằng cách kết nối thông qua FTP thông thường, nhưng bây giờ các IT của chúng tôi muốn thiết lập điều này qua kết nối FTPS an toàn.Truyền tệp qua FTPS (SSL/TLS) bằng C# .Net

Họ đã cung cấp cho tôi tệp * .cr_ chứng chỉ. Nếu tôi mở tập tin trong notepad tôi thấy một cái gì đó như thế này (nhưng với các phím thực không rõ ràng 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----- 

Tôi làm cách nào để sử dụng tệp chứng chỉ này để kết nối với máy chủ FTPS để tải lên và tải xuống tệp? Hãy tha thứ cho tôi nhưng tôi rất mới đối với bất kỳ điều gì liên quan đến việc chuyển các tệp qua mạng, kết nối an toàn, chứng chỉ, khóa công cộng, khóa cá nhân, v.v ...

Tôi nghĩ mình muốn sử dụng FtpWebRequest và đặt thuộc tính EnableSsl thành true. Nhưng tôi không chắc nơi tệp chứng chỉ này được phát.

Trả lời

2

This article giải thích cách thực hiện, với mã nguồn.

Mục đích của bài viết này là tạo ứng dụng khách C# FTP ở chế độ Bảo mật, vì vậy nếu bạn không có nhiều kiến ​​thức về FTPS, tôi khuyên bạn hãy xem xét điều này: FTPS. Trong .NET Framework, để tải lên một tập tin trong chế độ FTPS, chúng ta thường sử dụng lớp FtpWebRequest, nhưng bạn không thể gửi các lệnh với các đối số trích dẫn, và thậm chí nếu bạn tìm kiếm trên web, bạn sẽ không tìm thấy một bê tông ví dụ về máy khách C# FTP bảo mật.

Đó là vì những lý do đó tôi quyết định tạo bài viết này.

+0

Tôi đang xem bài viết đó và bản sao mã nguồn. Nhưng tôi không thể tìm ra nơi tôi sẽ thêm vào tập tin chứng chỉ này. –

+0

Cảm ơn Eric J, tôi actaully có cùng một câu hỏi như poster gốc và đó là mã mà tôi đang sử dụng (những gì bạn đã liên kết) .... vẫn cố gắng tìm ra cách để vượt qua "hostkey" của tôi vào mã đó. – ganders

17

Nếu bạn đang sử dụng FtpWebRequest Class, bạn chỉ cần thêm một số thứ để thiết lập yêu cầu. Hãy chắc chắn bao gồm tuyên bố 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; 

Ngoài ra, nếu bạn có vấn đề với các trường hợp ngoại lệ tạo chứng chỉ mà bạn có thể cần phải thực hiện phương pháp gọi lại xác nhận giấy chứng nhận của riêng bạn để sử dụng với ServicePointManager.ServerCertificateValidationCallback Property. Điều này có thể đơn giản như luôn trả về đúng hoặc tinh vi hơn như cách tôi sử dụng để gỡ lỗi:

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

Bạn có thể giải thích phần này "X509Certificate cert = X509Certificate.CreateFromCertFile (@" C: \ MyCertDir \ MyCertFile.cer ");" tôi có cần chứng chỉ cục bộ để truy cập FTPS không? – Reynan

+0

@Reynan Câu hỏi OPs là cách xác thực ứng dụng khách của mình với máy chủ FTPS bằng chứng chỉ được cấp cho anh ta và được lưu trữ trong một tệp. Đối với FTPS nơi người dùng được xác thực thông qua chỉ một tên người dùng và mật khẩu, điều này là không cần thiết. Vì mục đích của bạn, hãy xem http://stackoverflow.com/questions/9099738/upload-file-to-secured-ftp-in-asp-net. – JamieSee