.NET FtpWebRequest是否支持隐式(FTPS)和显式(FTPES)?

我被要求支持隐式和显式FTPS(也称为FTPES)。 我们目前正在使用.NET FtpWebRequestFtpWebRequest是否支持两种类型的FTPES,有什么区别?

谢谢

据我所知,当前(.NET 2.0和3.5)版本的FtpWebRequest仅支持Explicit SSL。

实际上,.NET 2.0目前不支持隐式SSL,只是显式的。 我们将考虑将其添加到将来的版本中。

JonCole – MSDN论坛post的 MSFTModerator

如果您需要同时使用Implict和Explicit TLS / SSL,则必须尝试使用​​第三方FTP / SSL组件之一。 以下代码使用我们的Rebex FTP / SSL,并从教程页面中获取 。

显式TLS / SSL

客户端以通常的非保护方式连接到FTP服务器,通常将端口21分配给FTP协议。 当需要使用SSL保护连接时,初始化SSL协商,保护控制连接并保护所有后续通信。

 // Create an instance of the Ftp class. Ftp ftp = new Ftp(); // Connect securely using explicit SSL. // Use the third argument to specify additional SSL parameters. ftp.Connect(hostname, 21, null, FtpSecurity.Explicit); // Connection is protected now, we can log in safely. ftp.Login(username, password); 

显式保护意味着可以随时保护连接。 如果您不知道在连接时是否需要保护,则可能需要使用普通的未加密FTP协议进行连接并在以后保护连接。

 Ftp ftp = new Ftp(); // Connect to the server with no protection. ftp.Connect(hostname, 21); // Upgrade connection to SSL. // This method also accepts an argument to specify SSL parameters. ftp.Secure(); // Connection is protected now, we can log in safely. ftp.Login(username, password); 

FTP会话的隐式SSL保护

FTP协议最初由IANA分配给一个单独的端口。 连接到此端口后,将立即启动SSL协商并确保控制连接。 所有数据连接也以相同方式隐式保护。 这类似于HTTPS使用的方法。

这种方法不受IETF的青睐,并且已被弃用。 Rebex FTP / SSL支持它与旧服务器的互操作性,但强烈建议尽可能使用显式保护。

 Ftp ftp = new Ftp(); // Connect securely using implicit SSL. // Use the third argument to specify additional SSL parameters. ftp.Connect(hostname, 990, null, FtpSecurity.Implicit); // Connection is protected now, we can log in safely. ftp.Login(username, password); 

您可以在rebex.net/ftp-ssl.net/下载该组件

我之前使用过Alex FTPS Client。 可能你应该看看http://ftps.codeplex.com/ 。

.NET Framework / FtpWebRequest仅支持显式TLS / SSL加密。 它不支持隐式TLS / SSL加密。

我相信它不太可能。 .NET框架的FTP实现仅使用协议的标准化function。 隐式TLS / SSL加密从未标准化。 它仅作为临时机制引入,允许对不支持加密的FTP客户端使用无缝加密。 通常,没有理由使用隐式TLS / SSL加密。 仅支持隐式TLS / SSL加密的FTP服务器已损坏,imo。 请注意, RFC 2228 [FTP安全扩展]是在20多年前推出的!


无论如何,如果您需要使用隐式TLS / SSL加密,则必须使用第三方FTP库。

使用WinSCP .NET程序集 ,很容易:

 // Set up session options SessionOptions sessionOptions = new SessionOptions { Protocol = Protocol.Ftp, UserName = "username", Password = "password", FtpSecure = FtpSecure.Implicit, }; using (Session session = new Session()) { // Connect session.Open(sessionOptions); // Your code } 

您可以让WinSCP GUI为您生成一个C#FTP代码模板 ,如上所示。

(我是WinSCP的作者)

您也可以尝试Ftp.dll FTP / FTPS客户端 。

它支持隐式显式 SSL连接。 这是隐含的样本:

 using(Ftp ftp = new Ftp()) { ftp.ConnectSSL("ftp.server.com"); ftp.Login("user", "password"); ftp.ChangeFolder("uploads"); ftp.UploadFile("report.txt", @"c:\report.txt"); ftp.Close(); } 

请注意,这是商业产品,我是该组件的作者。

edtFTPnet / PRO是一个FTP客户端库,也支持FTPS隐式和显式模式。 这只是指定正确协议的问题:

  SecureFTPConnection conn = new SecureFTPConnection(); conn.Protocol = FileTransferProtocol.FTPSImplicit; // set remote host, user, pwd etc ... // now connect conn.Connect(); 

同样的组件也支持SFTP。

是的,我是这个组件(以及edtFTPnet ,免费的开源.NET FTP客户端)的开发人员之一。