как заставить cURL отправить команду AUTH для FTPS?

Вопрос или проблема

это вызывает головную боль уже долгое время.

Ситуация:
у меня есть виртуальная машина, которая находится за прокси, который изолирует её от интернета. Прокси, похоже, работает нормально.

Я хочу использовать cURL для передачи (-T) ZIP-файла на FTP-сервер в интернете. FTP-сервер требует использования FTPS, т.е. SSL/TLS.

С моего компьютера с Windows я могу использовать тот же прокси (и те же учетные данные прокси) в TotalCommander, чтобы успешно установить FTPS-сессию с FTP-сервером, который я хочу использовать.

Так что я думаю, что FTP-сервер, а также прокси-сервер настроены нормально для этой цели.

Что я пытаюсь сделать:

В основном я пробую различные варианты следующей командной строки:

curl -vvv --ssl -T /path/to/my/file.zip ftp://my.ftpserver.com:21 --user USER:PASSWORD -x https://proxyuser:[email protected]:3128

Я вижу в подробном выводе, что cURL может аутентифицироваться на прокси и пытается подключиться к FTP-серверу. Однако он постоянно получает ошибку от SQUID (прокси), что

Squid отправил следующую FTP-команду:
USER myftp user

Сервер ответил:
Вы должны выполнить команду AUTH, чтобы перейти в зашифрованную сессию, прежде чем сможете попытаться войти.
550-Этот сервер требует шифрования

Когда я меняю назначение на использование ftps:// вместо ftp://, он продолжает говорить мне

curl: (35) gnutls_handshake() не удалось: Получен неожиданный пакет TLS.

Когда я смотрю в журнал сессии FTP TotalCommander, я вижу, что он аутентифицируется на прокси. Затем подключается к FTP-серверу и затем переходит в защищенный режим для аутентификации.

220-Добро пожаловать в Company-FTP
220 Сервер Company-FTP готов!
AUTH TLS
234 Переход в защищенный режим...
(сертификаты)
USER myftpuser
331 Имя пользователя в порядке. Необходим пароль.
PASS **********
230 Пароль в порядке. Подключено. Вошедший в систему
....

Что я могу сделать неправильно?

Я немного исследовал это и нашел пост в рассылке curl, что опция “–tlsv1” должна отправлять “AUTH TLS” первой, прежде чем “AUTH SSL”, однако я не думаю, что это делается, потому что даже если я использую переключатель –tlsv1, SQUID вернется с той же ошибкой, сказав, что он отправил “USER myftpuser” и получил эту ошибку 550.

Есть ли способ заставить cURL отправить этот “AUTH TLS”, который, кажется, отправляет TotalCommander и затем успешно аутентифицируется?

Большое спасибо
aslmx

Я думаю, что ответ – использовать опцию --ftp-ssl.
Я думаю, это похоже на то, как openssl требует опцию -starttls ftp. Это необходимо, потому что TLS для FTP несколько отличается от TLS для HTTP и других протоколов.

Ответ или решение

Как сделать так, чтобы cURL отправлял команду AUTH для FTPS?

Ваша ситуация, связанная с установкой FTPS-соединения через прокси, действительно может вызывать затруднения. В этом ответе мы подробно рассмотрим, как использовать cURL для передачи файлов по FTPS через прокси, и устраним возникшие проблемы.

Понимание FTPS

FTPS (FTP Secure) использует SSL или TLS для шифрования соединения. Это означает, что передача данных между клиентом и сервером осуществляется посредством защищенного канала. Ваша задача заключается в том, чтобы корректно инициировать FTPS-соединение, что потребует отправки команды AUTH TLS на FTP-сервер.

Настройки cURL для работы с FTPS

Чтобы cURL мог успешно установить FTPS-соединение через прокси, необходимо выполнить несколько действий:

  1. Использование правильного протокола:
    Для FTPS, вместо ftp://, необходимо использовать ftps://. Это сигнализирует cURL о необходимости использовать шифрование.

  2. Включение поддержки SSL/TLS:
    Чтобы cURL отправил команду AUTH TLS, вам нужно использовать опцию --ftp-ssl. Эта опция позволяет cURL сначала установить соединение, а затем начать сеанс шифрования:

    curl -vvv -T /path/to/my/file.zip ftps://my.ftpserver.com:21 --user USER:PASSWORD --ftp-ssl -x http://proxyuser:proxy_password@proxy_address:3128

    Обратите внимание, что используют HTTP-прокси (начиная с http://), если ваш прокси поддерживает FTP, используйте ftp://.

  3. Проверка версии TLS:
    Если вы сталкиваетесь с ошибками, связанными с установлением TLS-соединения, попробуйте указать версию TLS с помощью параметров --tlsv1.2, --tlsv1.1 или --tlsv1:

    curl -vvv -T /path/to/my/file.zip ftps://my.ftpserver.com:21 --user USER:PASSWORD --ftp-ssl --tlsv1.2 -x http://proxyuser:proxy_password@proxy_address:3128
  4. Аутентификация:
    Вам необходимо убедиться, что учетные данные для прокси и FTP-сервера вводятся правильно. Следите за тем, чтобы не возникали типографические ошибки и неправильно вставленные символы.

Обработка ошибок

Если ошибка все еще возникает, как в случае с сообщением gntls_handshake() failed: An unexpected TLS packet was received, это может указывать на проблему с протоколом или неправильной конфигурацией прокси:

  • Проверка прокси: Убедитесь, что ваш прокси разрешает FTPS-соединения. Некоторые прокси могут блокировать определенные типы трафика.

  • Создание журнала: Используйте -vvv (очень подробный вывод) для диагностики, чтобы понять на каком этапе происходит сбой.

Заключение

Для успешной передачи файлов по FTPS через прокси с помощью cURL необходимо правильно настроить команды, использовать нужные протоколы и параметры. С помощью указанных выше рекомендаций вы сможете корректно отправить файл, добавив необходимые шаги для аутентификации.

Если у вас все еще возникают трудности, убедитесь, что вы зависите от правильных настроек прокси и сервера, а также от действительности учетных данных.

Оцените материал
Добавить комментарий

Капча загружается...