Вопрос или проблема
это вызывает головную боль уже долгое время.
Ситуация:
у меня есть виртуальная машина, которая находится за прокси, который изолирует её от интернета. Прокси, похоже, работает нормально.
Я хочу использовать 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-соединение через прокси, необходимо выполнить несколько действий:
-
Использование правильного протокола:
Для FTPS, вместоftp://
, необходимо использоватьftps://
. Это сигнализирует cURL о необходимости использовать шифрование. -
Включение поддержки 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://
. -
Проверка версии 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
-
Аутентификация:
Вам необходимо убедиться, что учетные данные для прокси и FTP-сервера вводятся правильно. Следите за тем, чтобы не возникали типографические ошибки и неправильно вставленные символы.
Обработка ошибок
Если ошибка все еще возникает, как в случае с сообщением gntls_handshake() failed: An unexpected TLS packet was received
, это может указывать на проблему с протоколом или неправильной конфигурацией прокси:
-
Проверка прокси: Убедитесь, что ваш прокси разрешает FTPS-соединения. Некоторые прокси могут блокировать определенные типы трафика.
-
Создание журнала: Используйте
-vvv
(очень подробный вывод) для диагностики, чтобы понять на каком этапе происходит сбой.
Заключение
Для успешной передачи файлов по FTPS через прокси с помощью cURL необходимо правильно настроить команды, использовать нужные протоколы и параметры. С помощью указанных выше рекомендаций вы сможете корректно отправить файл, добавив необходимые шаги для аутентификации.
Если у вас все еще возникают трудности, убедитесь, что вы зависите от правильных настроек прокси и сервера, а также от действительности учетных данных.