Потрібна допомога C# в роботі по FTPS протоколу

Потрібно написати клієнта на C# для роботи з сервером по FTPS протоколу.
Використовується неявний метод шифрування (FTP over implicit TLS)
до сервера підключаюсь:

ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateServerSertificate);
        using (TcpClient client = new TcpClient(serverName, port))
        {
          using (SslStream sslstream = new SslStream(client.GetStream(),true, ServicePointManager.ServerCertificateValidationCallback))
          {
            sslstream.AuthenticateAsClient(serverName);
            
            //команди до сервера
          }
}

Використовую пасивний режим
До сервера підєднуюсь, можу ходити по папкам, але коли хочу отримати список файлів каталога (команда LIST), сервер відповідає 425 Can’t Open Data Connection.
Порти всі відкриті.
Ну і зараз я в глухому куті, тому що хз куди копати.
Можливо в когось є ідеї, або хтось стикався з таким, буду вдячний за допомогу.

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Пробовали использовать FtpWebRequest? stackoverflow.com/...ftp-using-client-certific, blogs.msdn.microsoft.com/...quest-to-do-ftp-over-ssl, stackoverflow.com/...t-ftps-and-explicit-ftpes. Или он все еще не поддерживает implicit SSL?

Ну, и, если подход выше не работает, попробуйте пример из MSDN msdn.microsoft.com/...tevalidationcallback.aspx, ваш пример кода отличеается.

Мало інфи, та і я не спец. Data connection — це другий коннекшн куди сервер вказує приєднатись для передачі данних після PASV? Видно через той порт і передаються дані сервером після того як отримає команду LIST (це швидше за все так, але хз, треба дивитись протокол) і виходить що таки є проблема з другим конекшном, може він обривається після з"єднання, може ще щось... Треба дивитись весь лістінг обміну командами-відповідями між клієнтом і сервером.

Взагалі якщо не стоїть задача писати низькорівнений FTPS клієнт, а просто залити файли кудись на FTPS-сервер то можна використати готові ліби. Я недавно використовував FluentFTP (колишній System.Net.FtpClient).
github.com/hgupta9/FluentFTP
Там зручно дивитись лістінг які команди куди ідуть і які відповіді від сервера і т.д., зручно дебажити і зрозуміти в чому причина.

так.
після команди PASV, сервер відповідає 227 Entering Passive Mode (serverName)
після команди LIST 150 File status okay;about open data connection.
потів здумується на певний час і видає 425 Can’t Open Data Connection

227 Entering Passive Mode (serverName)
То ж не просто server name. Там адреса з портом куди тобі (клієнту) треба відкрити друге з"єднання.

cr.yp.to/ftp/retr.html — про всяк випадок
Ти відкриваєш його? Чи там PORT команда від тебе і таки сервер зробить до тебе з«єднання і у тебе вже відкриті порти?
Ось наприклад лістінг команд на мій фтп-сервер (просто FTP, не FTPS, але немає різниці в даному випадку)
take.ms/1NZwZ

Просто якщо є вибір (я ж не знаю твоєї задачі і чи є у тебе вибір) то простіше юзати готові ліби в яких коннект, вичитка вмісту каталога, створення нового і заливка файлу — все робиться 10-ма строчками кода і всі нюанси з ФТП-серверами вирішуються на рівні ліби. Так як там багато нюансів з FTP, деякі речі не визначені однозначно стандартом і т.д.

п.с. ти питав «куди копати»? Взяти сторонню прогу ФТП-клієнт який показує все що він робить, типу FileZilla (насправді більшість показують логи) і дивитись які команди він надсилає і що отримує і порівнювати в чому це відрізніється від того що ти робиш — якщо не відкритий data connection то відкрити його чи дати команду серверу його відкрити і т.д.

Так, після команди PASV сервер повертає ір і номер порту по якому я маю конектитись.
Команду port я не використовую.
Наскільки я зрозумів потрібно юзати або pasv або port. Port в мене не їде, тому що я за фаєрволом сиджу.
Тому я використовую pasv.

Спробую заюзати filezilla, повторити те що він робить, і якщо в мене своім ходом не поіде, то вже буду юзати зазначену вище бібліотеку.
Дякую за допомогу!

Використовую пасивний режим
То есть, второе tcp соединение к серверу для data transfer вы открыли и все равно не работает?

И вопрос еще: почему не через FtpWebRequest ?

так.
на скільки я зрозумів, ftpwebrequest не дружить з FTP over implicit TLS

Тільки зараз побачив цю відповідь. Якщо можеш заюзати щось більш високорівневе ніж TcpClient, то ще раз рекомендую FluentFTP ( github.com/hgupta9/FluentFTP ). Він і з TLS, і з SSL (під капотом для цього він використовує той же SslStream) режимами FTPS працює, і взагалі з будь-яким FTP, приконнектиться сам куди сервер відповість, все дуже просто і зручно. І впорається з ним навіть просунута домогосподарка, тільки глянь в доки на тому ж гітхабі.

Сложно сказать, что может быть конкретно в вашем случае.
Могу предложить пройтись по порядку по ссылкам на аналогичные проблемы и посмотреть, что из перечисленного может подпасть под ваш случай:
bfy.tw/9AE8
У разных FTP серверов могут быть разные заморочки:
— некоторые оказываются чувствительны к регистру в путях и масках файлов
— некоторые не поддерживают абсолютные пути или требуют особого формата для абсолютных путей
— некоторые для выполнения отдельных команд будут открывать новое соединения через другой порт и может оказаться, что часть команд работает, а часть — нет, и только потому, что не все необходимые для данной версии FTP сервера порты были открыты.

Спробуйте погратись з налаштуваннями mode passive/active.

Сорі, нетпомітив в тексті.

Підписатись на коментарі