Загрузить файл на неявный сервер FTPS в C# с повторным использованием сеанса TLS - PullRequest
1 голос
/ 28 января 2020

Я пытаюсь загрузить файл на сервер FileZilla через ftps по протоколу TLS. На сервере порты 20 и 21 закрыты. Единственный способ, которым мне удалось подключиться к серверу, это использовать FluentFTP, но я не смог загрузить файл из-за какой-то ошибки сервера FileZilla.

https://github.com/robinrodricks/FluentFTP/issues/335
https://forum.filezilla-project.org/viewtopic.php?t=51601

public static void UploadTest(
    string pathUploadFile, string addressIP, int port, string location,
    string userName, string password)
{
    FtpClient ftp;

    Console.WriteLine("Configuring FTP to Connect to {0}", addressIP);
    ftp = new FtpClient(addressIP, port, new NetworkCredential(userName, password));
    ftp.ConnectTimeout = 600000;
    ftp.ReadTimeout = 60000;
    ftp.EncryptionMode = FtpEncryptionMode.Implicit;
    ftp.SslProtocols = SslProtocols.Default | SslProtocols.Tls11 | SslProtocols.Tls12;
    ftp.ValidateCertificate += new FtpSslValidation(OnValidateCertificate);
    ftp.Connect();
    // upload a file
    ftp.UploadFile(pathUploadFile, location);

    Console.WriteLine("Connected to {0}", addressIP);
    ftp.Disconnect();

    void OnValidateCertificate(FtpClient control, FtpSslValidationEventArgs e)
    {
        // add logic to test if certificate is valid here
        e.Accept = true;
    }
}

enter image description here

Можно ли обойтись без нарушения уровня безопасности? Если нет, то есть ли другая бесплатная библиотека, которая поддерживает загрузку файлов с TLS / SSL? Я тоже пробовал это, но это не сработало.
https://docs.microsoft.com/en-us/dotnet/api/system.net.ftpwebrequest.enablessl

Спасибо.

1 Ответ

1 голос
/ 28 января 2020

Если вы используете. NET Framework (не. NET Core), вы можете использовать WinSCP. NET сборка .

Он поддерживает неявный TLS (порт 990). ). И использует реализацию OpenSSL TLS (не. NET Framework), поэтому у нее не должно быть проблемы, которая есть у FluentFTP. Это определенно работает для меня на FTP-сервере FileZilla, даже если включено требование возобновления сеанса.

SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Ftp,
    HostName = "ftp.example.com",
    UserName = "username",
    Password = "password",
    FtpSecure = FtpSecure.Implicit,
    TlsHostCertificateFingerprint = "xx:xx:xx:...",
};

using (Session session = new Session())
{
    session.Open(sessionOptions);

    session.PutFiles(localPath, remotePath).Check();
}

(я автор WinSCP)

...