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

Por*_*key 27 .net c# ftp ftps ftpwebrequest

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

谢谢

Mar*_*obr 17

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

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

JonCole - MSDN论坛帖子的 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);
Run Code Online (Sandbox Code Playgroud)

显式保护意味着可以随时保护连接.如果您不知道在连接时是否需要保护,则可能需要使用普通的未加密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);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

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

  • 我理解你的担忧.然而,看起来目前的共识是,只要提供完整的披露,提及自己的产品在道德上是可以的.我甚至改变了我的昵称,以确保我的偏见不会被忽视;-).您可以在meta.stackoverflow上找到有趣的以下链接,讨论此主题:http://meta.stackexchange.com/questions/15787/is-it-bad-etiquette-to-mention-your-own-products-in-a- stackoverflow-answer和http://meta.stackexchange.com/questions/20031/vendors-on-stackoverflow.只要答案有效且身份不被隐藏,我认为这是可以的. (4认同)
  • 我很欣赏这篇文章,虽然看起来像是一种利益冲突...因为你代表了你所推动的组成部分. (3认同)

小智 13

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

  • @ mattmc3,我知道为什么MS没有构建隐式SSL; 这是因为它已被弃用. (3认同)

Mar*_*ryl 5

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

我相信它永远不可能。.NET框架的FTP实现仅使用协议的标准化功能。隐式TLS / SSL加密从未标准化。引入它只是作为一种临时机制,允许对不支持加密的FTP客户端使用无缝加密。通常,没有理由使用隐式TLS / SSL加密。仅支持隐式TLS / SSL加密的FTP服务器已损坏。请注意,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
}
Run Code Online (Sandbox Code Playgroud)

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

(我是WinSCP的作者)