我被要求支持隐式和显式 FTPS(也称为 FTPES)。我们目前正在使用 .NET FtpWebRequest
。是否FtpWebRequest
支持这两种类型的 FTPES,有什么区别?
谢谢
我被要求支持隐式和显式 FTPS(也称为 FTPES)。我们目前正在使用 .NET FtpWebRequest
。是否FtpWebRequest
支持这两种类型的 FTPES,有什么区别?
谢谢
据我所知,当前(.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);
我之前使用过 Alex FTPS 客户端。也许你应该看看http://ftps.codeplex.com/。
.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的作者)
您也可以尝试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 客户端)的开发者之一。
在隐式 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.
}