1. 程式人生 > >C#從基於FTPS的FTP server下載資料 (FtpWebRequest 的使用)SSL 加密

C#從基於FTPS的FTP server下載資料 (FtpWebRequest 的使用)SSL 加密

FTPS,亦或是FTPES, 是FTP協議的一種擴充套件,用於對TLS和SSL協議的支援。

本文講述瞭如何從一個基於FTPS的Server中下載資料的例項。

 

任何地方,如有紕漏,歡迎諸位道友指教。

 

話不多,上碼。

 using System;
  using System.Net;
  using System.IO;
  using System.Net.Security;
  using System.Security.Cryptography.X509Certificates;
  
  namespace FtpWebrequestBlogCase
  {
      class Program
     {
         static void Main(string[] args)
       {
             DownLoadFile("ftp://xxx/xxx.zip");
             Console.ReadKey();
         }
 
         public static void DownLoadFile(string addr)
         {
             var req = (FtpWebRequest)WebRequest.Create(addr);
             req.Method = WebRequestMethods.Ftp.DownloadFile;
             req.UseBinary = true;
             req.UsePassive = true;
             const string userName = "xxxx";
             const string password = "xxxx";
             req.Credentials = new NetworkCredential(userName, password);
 
            //如果要連線的 FTP 伺服器要求憑據並支援安全套接字層 (SSL),則應將 EnableSsl 設定為 true。
            //如果不寫會報出421錯誤(服務不可用)
             req.EnableSsl = true;
 
             // 首次連線FTP server時,會有一個證書分配過程。
             //如果沒有下面的程式碼會報異常:
             //System.Security.Authentication.AuthenticationException: 根據驗證過程,遠端證書無效。
             ServicePointManager.ServerCertificateValidationCallback =
                new RemoteCertificateValidationCallback(ValidateServerCertificate);
             try
             {
                 using (var res = (FtpWebResponse)req.GetResponse())
                 {
                     const string localfile = "test.zip";
                     var fs = new FileStream(localfile, FileMode.Create, FileAccess.Write);
                     const int buffer = 1024*1000;
                     var b = new byte[buffer];
                     var i = 0;
                     var stream = res.GetResponseStream();
                     while (stream != null && (i = stream.Read(b, 0, buffer)) > 0)
                     {
                         fs.Write(b, 0, i);
                         fs.Flush();
                     }
                 }
                 Console.WriteLine("done!");
 
             }
            catch (Exception ex)
             {
                 var message = ex.ToString();
                 Console.WriteLine(message);
             }
             finally
             {
 
             }
         }

         public static bool ValidateServerCertificate
             (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
             return true;
         }
     }
 }

其實之比正常的FTP下載檔案函式多了兩句程式碼:

1  req.EnableSsl = true;  基於FTPS的 FTP 伺服器會要求憑據並支援安全套接字層 (SSL),所以需要設定為True.

 

2  ServicePointManager.ServerCertificateValidationCallback = 

                new RemoteCertificateValidationCallback(ValidateServerCertificate);

 

        public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
                return true;
        }

證書驗證過程。

 

下篇文章將探討如何封裝FTPWebRequest類,使其更加健壯易用。