Поддерживает ли.NET FtpWebRequest как неявный (FTPS), так и явный (FTPES)?
Меня просят поддержать неявную и явную FTPS (также известную как FTPES). В настоящее время мы используем.NET FtpWebRequest
, Ли FtpWebRequest
поддерживает оба типа FTPES, и в чем разница?
Спасибо
6 ответов
Насколько я знаю, текущая (.NET 2.0 и 3.5) версия FtpWebRequest поддерживает только явный SSL.
На самом деле.NET 2.0 в настоящее время не поддерживает неявный SSL, только явный. Мы рассмотрим добавление этого в будущем выпуске.
JonCole - MSFTModerator в сообщении на форуме MSDN
Если вам нужно использовать как 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);
Неявная SSL-защита сеанса FTP
Протокол 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);
Вы можете скачать компонент по адресу http://www.rebex.net/ftp-ssl.net/download.aspx
Я использовал Alex FTPS Client ранее. Может быть, вы должны посмотреть на http://ftps.codeplex.com/.
.NET Framework/FtpWebRequest
поддерживает только явное шифрование TLS/SSL. Он не поддерживает неявное шифрование TLS/SSL.
Я верю, что это вряд ли когда-либо случится. Реализация платформ.NET на FTP использует только стандартизированные функции протокола. Неявное шифрование TLS/SSL никогда не было стандартизировано. Он был введен только как временный механизм, позволяющий использовать бесшовное шифрование с FTP-клиентами, которые не поддерживают шифрование. В общем, нет причин использовать неявное шифрование TLS/SSL. FTP-сервер, который поддерживает только неявное шифрование TLS/SSL, не работает, 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, бесплатного FTP-клиента с открытым исходным кодом.NET).
Использование FTP поверх неявного SSL не так просто, но это можно сделать в .NET без использования какой-либо сторонней библиотеки. Поскольку неявный SSL - это в основном команды FTP, выполняемые через SSL-соединение, нам просто нужно настроить SSL-соединение с .NET, а затем выполнить команды, необходимые для загрузки файла.
// 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.
}