FTP、SFTP与FTPS
先简单介绍下FTP的基础知识
FTP的传输有两种方式:ASCII、二进制。
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密钥。
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安全扩展至少有两种不同的初始化方法:显式安全和隐式安全。
- 显示安全:为了建立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 = ;
byte[] buff = new byte[buffLength];
int contentLen;
FileStream fs = fileInf.OpenRead();
Stream strm = null;
strm = reqFTP.GetRequestStream();
while (contentLen != )
{
strm.Write(buff, , contentLen);
contentLen = fs.Read(buff, , 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 = ;
byte[] buff = new byte[buffLength];
int contentLen;
FileStream fs = fileInf.OpenRead();
Stream strm = null;
strm = reqFTP.GetRequestStream();
while (contentLen != )
{
strm.Write(buff, , contentLen);
contentLen = fs.Read(buff, , buffLength);
}
SFTP文件上传代码就不展示了,C#需借第三方DLL之手实现SSH,流这块的处理都封装起来了,推荐Renci.SshNet.dll。
FTP、SFTP与FTPS的更多相关文章
- linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl)(zz)
linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl) 分类: linux2011-10-10 13:21 8773人阅读 评论(1) 收藏 举 ...
- <转>SFTP 和FTPS的区别是什么?
SFTP 和FTPS都是为ftp连接加密,协议非常相似. 一个是借助ssl协议加密,一个时借助ssh加密. ssl是为http/smtp等加密设计的,ssh是为telnet/ftp等加密.建立传输通道 ...
- linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl)
因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp, ...
- ftp sftp vsftp
ftp sftp (secure) 是文件传输 协议 vsftp(very secure) 是 ftp 服务端 sftp 是 ssh 的一部分
- 开源FTP/SFTP客户端 FileZilla v3.31.0 绿色便携版
下载地址:点我 基本介绍 FileZilla是一种快速.可信赖的FTP客户端以及服务器端开放源代码程式,具有多种特色.直觉的接口.可控性.有条理的界面和管理多站点的简化方式使得Filezilla客户端 ...
- [转帖]使用Gnome文件管理器连接到服务器:FTP/SFTP、Samba、NFS的方法
使用Gnome文件管理器连接到服务器:FTP/SFTP.Samba.NFS的方法 2019-05-09 16:28:44作者:雷增线稿源:云网牛站 https://ywnz.com/linuxyffq ...
- Linux系统下搭建FTP/SFTP服务器
传输文件经常使用ftp和sftp服务器.Windows下有多种可视化工具,使用快捷.Linux经常需要自行搭建这两种服务器,当然搭建熟练的话,会更加快捷. 1.检查Linux系统是否安装了vsftp和 ...
- 线程.FTP.SFTP.打包
Windows就是多线程模式.每一个解决方案就是一个进程.一个进程下拥有多个线程. 简单点.单核的处理器不存在多线程.是CPU在每一个线程上切换处理.在人反应不过来的情况下完成同步的效果. 比如左手画 ...
- FTP+SFTP工具类封装-springmore让开发更简单
github地址:https://github.com/tangyanbo/springmore FTPUtil 该工具基于org.apache.commons.net.ftp.FTPClient进行 ...
随机推荐
- Eclipse设置控制台字体
打开 Window - preferences-- general - appearance - colors and fonts --debug - console font 进行设置.
- POJ 3537 Crosses and Crosses(sg博弈)
题目:在1*n 的棋盘里面,A和B都在里面画叉 , 如果谁可以画了一个叉后,可以连成3个叉,那谁胜利 : 分析: 首先考虑如果我在玩游戏,我最希望对手可以画出-x-x or -xx- , 这种 ...
- Codeforces Round #364 (Div. 2) B
Description Vasya has the square chessboard of size n × n and m rooks. Initially the chessboard is e ...
- dpkg dependency problems prevent configuration
dpkg: dependency problems prevent configuration of cr3: cr3 depends on libpng12-0 (>= 1.2.13-4); ...
- 【Unity3D】Tags和Layers
Tags和Layers分别表示是Unity引擎里面的标签和层,他们都是用来对GameObject进行标识的属性,Tags常用于单个GameObject,Layers常用于一组的GameObject.添 ...
- 2018护网杯-easy_laravel 复现
题目docker环境: https://github.com/sco4x0/huwangbei2018_easy_laravel git clone下来直接composer up -d 运行即可,可以 ...
- 用cookie实现记住密码
jsp-4 用cookie实现记住密码 这次就有点简单了 基本是jsp-3的代码但是有些修改 public void login(HttpServletRequest req, HttpServlet ...
- sublime格式化HTML+CSS插件--HTML-CSS-JS Prettify
介绍 在工作中经常会下载不同项目的源码,可能是压缩的原因,其中一些代码的格式十分的乱,这样就会导致阅读起来十分的不方便,所以下面介绍一个sublime的插件:HTML-CSS-JS Prettify ...
- 客户端设置WebService调用超时时间
刚接触WebService,对如何在客户端设置WebService调用超时时间查阅了一些资料,现总结如下: ============================================== ...
- 输入网址调用第三方接口获取结果_java
最近公司给了一个第三方服务的网址,要我调用后返回需要用到的信息 具体网址:http://www.xxxx.com/xxx-api/xxxx/getXxxByUserId?userId=" + ...