FTPS (FTP over SSL) vs. SFTP (SSH 文件传输协议): 我们如何做出选择

  最近在制作我们系统的发布包时,整理到ftp的时候,发现我们使用的是ssh模式进行文件传输的,而不是RFC 959的ftp,于是查了下,发现存在两种模式的文件传输模式,FTP和SSH。

  •      第一个RFC的FTP协议发布通过网络使用FTP协议(由RFC 959或更高版本)的文件传输始于1980年,FTP提供上传,下载和删除文件,创建和删除目录,读取目录内容的功能。虽然FTP是非常受欢迎的,它有一些缺点,使其更难使用。主要的缺点是缺乏目录列表的统一格式(这个问题已经通过引入MLST命令部分解决,但是一些服务器不支持)和辅助连接(DATA连接)的存在。FTP中的安全性通过对RFC 2228中定义的信道加密采用SSL / TLS协议来提供。FTP的安全版本称为FTPS。
  •      在UNIX系统中,另一种安全标准有所提升。它是SSH协议家族的一员,SSH的主要功能是保护远程shell访问UNIX系统。后来SSH扩展了文件传输协议 - 第一个是SCP(SSH 1.x),然后是SFTP(SSH2)。版本1中的SSH协议已经过时了,而且不安全,我们一般不推荐使用。 因此,SCP不再被使用,然后SFTP却日益流行。

     “SFTP”缩写经常被误解是FTP某种安全的类型,人们通常认为是FTPS。另一个(类似的)误解是SFTP被认为是某种基于SSL的FTP。 而实际上SFTP是“SSH文件传输协议”的缩写这不是基于SSL的FTP(这在技术上也是可能的,但是非常少见),而是基于SSH的FTP

     SFTP是一种二进制协议,其最新版本在RFC 4253中被标准化。所有命令(请求)被打包为二进制消息,并发送到服务器,服务器使用二进制回复包进行回复。在之后的版本中,SFTP被扩展为不仅仅提供文件上传/下载操作,还提供一些文件系统操作,例如文件锁定,符号链接创建等。

     FTPS和SFTP都使用非对称算法(RSA,DSA),对称算法(DES / 3DES,AES,Twhofish等)和密钥交换算法的组合。对于验证FTPS(或更准确地说,FTP下的SSL / TLS协议)使用X.509证书,而SFTP(SSH协议)使用SSH密钥。

     X.509证书包括公钥和有关证书所有者的某些信息。此信息允许另一方验证证书本身的完整性和证书所有者的真实性。验证可以通过计算机和在一定程度上由人来完成。 X.509证书具有关联的私钥,出于安全原因,通常与证书分开存储。

     SSH密钥只包含公钥(相关的私钥是单独存储的)。它不包含有关密钥所有者的任何信息。 同样也不包含允许可靠地验证完整性和真实性的信息。 一些SSH软件实现使用X.509证书进行身份验证,但实际上它们不验证整个证书链 - 只使用公钥(这使得此类身份验证不完整,类似于SSH密钥身份验证)。

     以下是两个协议的优缺点的简要列表:

     FTPS

     优点:

  • 广为人知并使用
  • 通信可以由人阅读和理解
  • 提供了服务器到服务器文件传输的服务
  • SSL / TLS具有良好的身份验证机制(X.509证书功能)
  • 在许多互联网通信框架中都支持内置FTP与SSL / TLS。

     缺点:

  • 没有统一的目录列表格式
  • 需要辅助数据通道,这使其难以在防火墙后使用
  • 没有为文件名定义标准字符集(编码)
  • 并非所有FTP服务器都支持SSL / TLS
  • 没有标准的方式来获取和更改文件和目录属性

     SFTP

     优点:

  • 有良好的标准背景,在操作方面具有严格的定义
  • 只有一个连接(不需要DATA连接)
  • 连接始终保持安全
  • 统一的目录列表格式
  • 协议包括用于权限和属性操作,文件锁定和更多功能的操作

     缺点:

  • 通信是二进制的,可读性差
  • SSH密钥更难以管理和验证
  • 标准将某些事物定义为可选或推荐的,这导致某些兼容性问题
  • 没有服务器到服务器副本以及递归目录删除操作
  • 在VCL和.NET框架中不支持内置的SSH / SFTP
  • 性能相比FTP要低1/2

    如何做出选择

    通常,答案取决于您的目标和要求。 一般来说,SFTP在技术上优于FTPS。 当然,实现对两个协议的支持是一个好主意,但是它们在概念,支持的命令和许多其他方面是不同的。

    当您具有需要从个人设备(智能手机,PDA等)访问的服务器或具有FTP支持但没有SSH / SFTP客户端的某些特定操作系统时,最好使用FTPS。 如果您正在构建自定义安全解决方案,SFTP可能是更好的选择。

    对于客户端,需求由您计划连接的服务器定义。 当连接到Internet服务器时,SFTP更受欢迎,因为它默认由Linux和UNIX服务器支持。

    对于私有主机到主机传输,您可以使用SFTP和FTPS。 对于FTPS,您需要搜索一个免费的FTPS客户端和服务器软件或购买商业许可证。 对于SFTP支持,您可以安装OpenSSH软件包,它提供免费的客户端和服务器软件。 对于商业用途,我们建议使用Bitvise SSH服务器。

    java客户端开发工具

    在java中,jsch能够支持ftps和sftp。

    在c++中,libssh2能够支持sftp,ftp可以直接用socket进行通信。

    java服务端开发工具

    如果实现ftp的服务器端,可以考虑采用Apache FtpServer实现,其支持ssl,如果要在此基础上实现内存FTP,可以采用嵌入式+jimfs(java的内存文件系统实现),参考https://stackoverflow.com/questions/30394737/in-memory-file-system-in-java,https://stackoverflow.com/questions/31388036/how-to-handle-incoming-files-in-apache-mina-sshd-sftp-server-in-java。要实现SSH协议,可以考虑Apache SSHDSSHTOOLS

   所以,对大部分情况来说,sftp可能是更合适的方案,它不需要专门安装vsftpd软件,能够同时支持java/c++,省去了软件发布的麻烦。但是如果传输的数据量巨大,那么就要考虑是否采用FTP或FTPS了,它比SFTP的性能要高大约1/2,参见https://stackoverflow.com/questions/8849240/why-when-i-transfer-a-file-through-sftp-it-takes-longer-than-ftp(注:我们在局域网中亲自验证了该场景,千兆网络的2G文件传输,SFTP平均只能达到50多M每秒,直接http/FileZilla)。

posted @ 2018-09-24 13:07  zhjh256  阅读(2508)  评论(0编辑  收藏  举报