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。

相关文章
相关标签/搜索