FTP、SFTP与FTPS

摘要:
对于身份验证,FTPS使用X.509证书,而SFTP使用SSH密钥。FTPS简介及其优缺点FTPS也称为“FTP-SSL”和“FTP over SSL”。SSL是一种协议,用于通过SSL功能对客户端和服务器之间的安全连接中的数据进行加密和解密。SFTP和FTP具有几乎相同的语法和功能。总的来说,SFTP在技术上优于FTPS。对于FTPS,您需要搜索免费的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 = 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。

  

免责声明:文章转载自《FTP、SFTP与FTPS》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何使用python获取电脑剪切板的文字?虚拟机下CentOS7开启SSH连接下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ARM 平台下的 SSHD 配置

sshd_config 文件中 允许 root 用户登录 PermitRootLogin yes 配置为内部的 sftp Subsystem sftp internal-sftp key 配置 ssh-keygen -t rsa -f ssh_host_rsa_key -N ""ssh-keygen -t dsa -f ssh_host_dsa_key -...

vps建站教程 CentOS6如何安装配置FTP服务器

通过之前的几篇文章,我们都知道了如何配置PHP环境,也知道如何保护我们的vps以及如何绑定多个域名建设多个网站。有时候我们为了让我们的朋友也能用我们的vps建站又不想给他们太多权限,有时候我们想要当个主机商卖卖虚拟空间过过瘾又不想装管理环境,那么就想要装个ftp服务器了。 经过前面的教程,相信大家对管理vps的操作是比较熟悉了,这里我就不在截图了,安装ft...

VNC-Server安装及配置

一、什么是VNC?VNC (Virtual Network Computer)是虚拟网络计算机的缩写。VNC 是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的。VNC 是在基于 UNIX 和 Linux 操作系统的免费的开源软件,远程控制能力强大,高效实用,其性能可以和 Windows 和 MAC 中的任何远程控制软件媲美。...

使用Dockerfile制作镜像

组成部分 基础镜像信息 FROM 维护者信息 MAINTAINER、LABEL 镜像操作指令 RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER等 容器启动时执行指令 CMD、ENTRYPOINT 1、MAINTAINER (docker1.7以后的版本已被LABEL替代,但仍兼容此字段) 格式: MAINTAINER &...

Python脚本与Metasploit交互攻击

Metasploit是一款强大的漏洞扫描和利用工具,编写Python脚本与Metasploit进行交互,可以自动化的扫描和利用漏洞。 相关文章:Metasploit框架的使用 在脚本中,我们首选需要利用 nmap 模块扫描目标主机是否开放了445端口,我们写了一个 findTarget()函数,来扫描给定ip或者给定网段中开放了目标端口的主机,返回开放了4...

C#-Ftp操作

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System; using System.Collections.Generic; using System.L...