C#從基於FTPS的FTP server下載資料 (FtpWebRequest 的使用)SSL 加密
阿新 • • 發佈:2018-12-29
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類,使其更加健壯易用。