29

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

谢谢

4

6 回答 6

17

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

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

JonCole - MSDN 论坛帖子上的MSFTModerator

如果您需要同时使用隐式和显式 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 保护

FTPS 协议最初由 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/下载该组件

于 2009-12-08T20:02:04.277 回答
14

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

于 2010-02-20T08:05:50.560 回答
7

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

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


无论如何,如果您需要使用隐式 TLS/SSL 加密,则必须使用第 3 方 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的作者)

于 2017-06-26T09:31:09.743 回答
1

您也可以尝试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();
}

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

于 2010-11-27T01:00:28.633 回答
0

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 客户端)的开发者之一。

于 2010-02-26T12:43:51.540 回答
0

在隐式 SSL 上使用 FTP 并不那么简单,但它可以在 .NET 中完成,而无需使用任何 3rd 方库。由于隐式 SSL 基本上是通过 SSL 连接完成的 FTP 命令,我们只需要设置与 .NET 的 SSL 连接,然后发出下载文件所需的命令。

// Open a connection to the server over port 990
// (default port for FTP over implicit SSL)
using (TcpClient client = new TcpClient("localhost", 990))
using (SslStream sslStream = new SslStream(client.GetStream(), true))
{
    // Start SSL/TLS Handshake
    sslStream.AuthenticateAsClient("localhost");


    // Setup a delegate for writing FTP commands to the SSL stream.
    Action WriteCommand = delegate(string command)
    {
        var commandBytes = Encoding.ASCII.GetBytes(command + Environment.NewLine);
        sslStream.Write(commandBytes, 0, commandBytes.Length);
    };


    // Write raw FTP commands to the SSL stream.
    WriteCommand("USER username");
    WriteCommand("PASS ***p@ssw0rd***"); 

    // Connect to data port to download the file.
}
于 2021-10-25T11:02:33.360 回答