FTP、SFTP與FTPS

先簡單介紹下FTP的基礎知識

  FTP的傳輸有兩種方式:ASCII、二進制。html

  FTP支持兩種模式:Standard (PORT方式,主動方式),Passive (PASV,被動方式)。算法

  • 主動模式

  FTP 客戶端首先和服務器的TCP 21端口創建鏈接,用來發送命令,客戶端須要接收數據的時候在這個通道上發送PORT命令。PORT命令包含了客戶端用什麼端口接收數據。在傳送數據的時候,服務器端經過本身的TCP 20端口鏈接至客戶端的指定端口發送數據。FTP server必須和客戶端創建一個新的鏈接用來傳送數據。安全

  • 被動模式

  創建控制通道和Standard模式相似,但創建鏈接後發送Pasv命令。服務器收到Pasv命令後,打開一個臨時端口(端口號大於1023小於65535)而且通知客戶端在這個端口上傳送數據的請求,客戶端鏈接FTP服務器此端口,而後FTP服務器將經過這個端口傳送數據。服務器

  不少防火牆在設置的時候都是不容許接受外部發起的鏈接的,因此許多位於防火牆後或內網的FTP服務器不支持PASV模式,由於客戶端沒法穿過防火牆打開FTP服務器的高端端口(例如防火牆只開放了20、21端口);而許多內網的客戶端不能用PORT模式登錄FTP服務器,由於從服務器的TCP 20沒法和內部網絡的客戶端創建一個新的鏈接,形成沒法工做。說白了就是取決於防火牆限制了客戶端仍是服務器,若是雙方都關閉了防火牆那麼這兩種模式應該都是能夠的。網絡

 

爲何要用SFTP或FTPS

  當你在FTP服務器上收發文件的時候,你面臨兩個風險。第一個風險是在上載文件的時候是明文傳輸。第二個風險是,這些文件在你等待接收方下載的時候將停留在FTP服務器上。框架

  FTPS和SFTP都使用非對稱算法(RSA,DSA),對稱算法(DES / 3DES,AES,Twhofish等)和密鑰交換算法的組合。對於驗證FTPS(或更準確地說,FTP下的SSL / TLS協議)使用X.509證書,而SFTP(SSH協議)使用SSH密鑰。ssh

    X.509證書包括公鑰和有關證書全部者的某些信息。此信息容許另外一方驗證證書自己的完整性和證書全部者的真實性。驗證能夠經過計算機和在必定程度上由人來完成。 X.509證書具備關聯的私鑰,出於安全緣由,一般與證書分開存儲。編碼

      SSH密鑰只包含公鑰(相關的私鑰是單獨存儲的)。它不包含有關密鑰全部者的任何信息。 一樣也不包含容許可靠地驗證完整性和真實性的信息。 一些SSH軟件實現使用X.509證書進行身份驗證,但實際上它們不驗證整個證書鏈 - 只使用公鑰(這使得此類身份驗證不完整,相似於SSH密鑰身份驗證)。加密

 

FTPS介紹以及它的優缺點

  FTPS也稱做「FTP-SSL」和「FTP-over-SSL」,SSL是一個在客戶機和具備SSL功能的服務器之間的安全鏈接中對數據進行加密和解密的協議。SL/TLS協議在傳輸層(TCP/IP)之上、可是在應用層之下工做的。所以,它能夠很容易在諸如HTTP,Telnet,POP3,IMAP4,SMTP和FTP等應用層協議上實現。SSL安全擴展至少有兩種不一樣的初始化方法:顯式安全和隱式安全。 spa

  • 顯示安全:爲了創建SSL鏈接,顯式安全要求FTP客戶端在和FTP服務器創建鏈接後發送一個特定的命令給FTP服務器。客戶端使用服務器的缺省端口。
  • 隱式安全:當FTP客戶端鏈接到FTP服務器時,隱式安全將會自動和SSL鏈接一塊兒開始運行。在隱式安全中服務器定義了一個特定的端口(TCP端口990)讓客戶端來和其創建安全鏈接。

  優勢:

  • 有良好的標準背景,在操做方面具備嚴格的定義
  • 只有一個鏈接(不須要DATA鏈接)
  • 鏈接始終保持安全
  • 統一的目錄列表格式
  • 協議包括用於權限和屬性操做,文件鎖定和更多功能的操做

  缺點:

  • 通訊是二進制的,可讀性差
  • SSH密鑰更難以管理和驗證
  • 標準將某些事物定義爲可選或推薦的,這致使某些兼容性問題
  • 沒有服務器到服務器副本以及遞歸目錄刪除操做
  • 在VCL和.NET框架中不支持內置的SSH / SFTP

 

SFTP介紹以及它的優缺點

   SFTP是Secure File Transfer Protocol的縮寫,安全文件傳送協議。能夠爲傳輸文件提供一種安全的加密方法。SFTP 與 FTP 有着幾乎同樣的語法和功能。SFTP 爲 SSH的一部分。其實在SSH軟件包中,已經包含了一個叫做SFTP(Secure File Transfer Protocol)的安全文件傳輸子系統,SFTP自己沒有單獨的守護進程,它必須使用sshd守護進程(端口號默認是22)來完成相應的鏈接操做,因此從某種意義上來講,SFTP並不像一個服務器程序,而更像是一個客戶端程序。SFTP一樣是使用加密傳輸認證信息和傳輸的數據,因此,使用SFTP是很是安全的。可是,因爲這種傳輸方式使用了加密/解密技術,因此傳輸效率比普通的FTP要低得多,若是您對網絡安全性要求更高時,可使用SFTP代替FTP。

  優勢:

  • 廣爲人知並使用
  • 通訊能夠由人閱讀和理解
  • 提供了服務器到服務器文件傳輸的服務
  • SSL / TLS具備良好的身份驗證機制(X.509證書功能)
  • 在許多互聯網通訊框架中都支持內置FTP與SSL / TLS。

      缺點:

  • 沒有統一的目錄列表格式
  • 須要輔助數據通道,這使其難以在防火牆後使用
  • 沒有爲文件名定義標準字符集(編碼)
  • 並不是全部FTP服務器都支持SSL / TLS
  • 沒有標準的方式來獲取和更改文件和目錄屬性

  

根據場景如何選擇?

  一般,答案取決於您的目標和要求。 通常來講,SFTP在技術上優於FTPS。 固然,實現對兩個協議的支持是一個好主意,可是它們在概念,支持的命令和許多其餘方面是不一樣的。

  當您具備須要從我的設備(智能手機,PDA等)訪問的服務器或具備FTP支持但沒有SSH / SFTP客戶端的某些特定操做系統時,最好使用FTPS。 若是您正在構建自定義安全解決方案,SFTP多是更好的選擇。

     對於客戶端,需求由您計劃鏈接的服務器定義。 當鏈接到Internet服務器時,SFTP更受歡迎,由於它默認由Linux和UNIX服務器支持。

     對於私有主機到主機傳輸,您可使用SFTP和FTPS。 對於FTPS,您須要搜索一個免費的FTPS客戶端和服務器軟件或購買商業許可證。 對於SFTP支持,您能夠安裝OpenSSH軟件包,它提供免費的客戶端和服務器軟件。 對於商業用途,咱們建議使用Bitvise SSH服務器。

    [敲黑板、劃重點] 若是您是軟件開發人員,而且須要在應用程序中實現文件傳輸功能,則您將搜索組件以執行該做業。

     .NET 中,對.NET Framework中的FTPS有內置支持(請參閱FtpWebRequest類)。 可是這個類的功能受到嚴格限制,特別是在SSL / TLS控制方面。
.NET Framework不包括對SSH或SFTP的任何支持。

   注意.NET內置語法僅支持顯式的FTP over SSL,通常FTP服務器隱式端口爲990,而顯式端口是21,必定要勾選容許顯式加密訪問。

     VCL 中,您能夠選擇提供FTP功能的免費組件和庫。 當您向他們添加OpenSSL時,您能夠免費獲取FTPS。 若是您不想處理OpenSSL DLL,您可使用一個商業上可用的庫來支持SSL和FTPS。 再次提醒,沒有免費的SFTP組件可用於.NET。

     Java 中,FTPS和SFTP客戶端存在幾個不受支持和錯誤。

 

  以上參考原文: https://blog.csdn.net/shmilychan/article/details/51848850

  以上參考原文: https://www.cnblogs.com/OLDMAN-LU/p/6428274.html   

 

  FTP文件上傳代碼展現:

    FtpWebRequest reqFTP;
    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
    reqFTP.KeepAlive = false;
    reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
    reqFTP.UseBinary = true;

    reqFTP.ContentLength = fileInf.Length;
    int buffLength = 20480;
    byte[] buff = new byte[buffLength];
    int contentLen;
    FileStream fs = fileInf.OpenRead();
    Stream strm = null;
    strm = reqFTP.GetRequestStream();
    while (contentLen != 0)
    {
        strm.Write(buff, 0, contentLen);
        contentLen = fs.Read(buff, 0, buffLength);
    }

  

  FTPS文件上傳代碼展現:

    //驗證服務器證書,舉例默認返回true
    public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        return true;
    }
  
    FtpWebRequest reqFTP;
    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
    reqFTP.KeepAlive = false;
    reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
    reqFTP.UseBinary = true;

    //相比FTP,SFTP要求支持SSL
    req.EnableSsl = true;
    //首次鏈接頒發證書
    ServicePointManager.ServerCertificateValidationCallback = new  RemoteCertificateValidationCallback(ValidateServerCertificate);

    reqFTP.ContentLength = fileInf.Length;
    int buffLength = 20480;
    byte[] buff = new byte[buffLength];
    int contentLen;
    FileStream fs = fileInf.OpenRead();
    Stream strm = null;
    strm = reqFTP.GetRequestStream();
    while (contentLen != 0)
    {
        strm.Write(buff, 0, contentLen);
        contentLen = fs.Read(buff, 0, buffLength);
    }

 

  SFTP文件上傳代碼就不展現了,C#需借第三方DLL之手實現SSH,流這塊的處理都封裝起來了,推薦Renci.SshNet.dll。

相關文章
相關標籤/搜索