欢迎光顾小店
最近在制作我们系统的发布包时,整理到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是“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 SSHD或SSHTOOLS。
注:我们在局域网中亲自验证了该场景,千兆网络的2G文件传输,SFTP平均只能达到50多M每秒,直接http/FileZilla)。
开发
以libssh2库方式支持windows,linux客户端开发 https://github.com/libssh2/libssh2
开发demo https://github.com/libssh2/libssh2/blob/master/example/sftp_write.c
参考
https://www.ssh.com/academy/ssh/sftp