Вопрос или проблема
Я посмотрел на связанные проблемы, но ни одна из них не решила мою проблему.
Я пытаюсь передать файлы через FTP с помощью curl
на сервер в моей DMZ с FTPS сервера на EC2 сервере, работающем под управлением vsftpd
.
$ curl ftps://ec2-myserver.compute.amazonaws.com --verbose --tlsv1.1
* Переосмысленный URL: ftps://ec2-myserver.us-east-2.compute.amazonaws.com/
* Пытаюсь ip_addr...
* TCP_NODELAY установлен
* Соединено с ec2-myserver.us-east-2.compute.amazonaws.com (ip_addr) порт ---- (#0)
* успешно установлены параметры проверки сертификата:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* TLSv1.1 (OUT), TLS handshake, Client hello (1):
* ошибка:1408F10B:SSL routines:ssl3_get_record:неправильный номер версии
* Закрытие соединения 0
Я могу получить файловое соединение FTPS из Filezilla на сервере Windows.
Я получаю одну и ту же ошибку на каждой версии TLS.
Я пытался включить ssl3 на сервере vsftpd
, но это не решило проблему.
Я запускал vsftpd в конфигурации chroot, и он не выдавал ошибок (потому что не мог получить доступ к /dev/log
в chroot, я полагаю?)
chroot_local_user=YES
local_root=public_html
Я видел OK LOGIN
в vsftpd.log
, но на клиенте, после отправки имени пользователя и пароля, это приводило к ошибке:
client% openssl s_client -connect testftps.example.org:21 --tls1_2 --starttls ftp -quiet
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R3
verify return:1
depth=0 CN = testftps.example.org
verify return:1
220 Добро пожаловать в TEST vsftpd FTPS сервис.
user ftptest
331 Пожалуйста, укажите пароль.
pass xxxxxxxx
140419419894912:error:1408F10B:SSL routines:ssl3_get_record:неправильный номер версии:../ssl/record/ssl3_record.c:308:
Только использование strace
vsftpd выявило проблему:
server# strace -tt -ff -s500 -p `pidof vsftpd`
[...]
[pid 27164] 18:31:56.249184 access("/", W_OK) = 0
[pid 27164] 18:31:56.249386 fcntl(0, F_GETFL) = 0x2 (флаги O_RDWR)
[pid 27164] 18:31:56.249599 fcntl(0, F_SETFL, O_RDWR|O_NONBLOCK) = 0
[pid 27164] 18:31:56.249763 write(0, "500 OOPS: ", 10) = 10
[pid 27164] 18:31:56.250118 write(0, "vsftpd: отказано в запуске с доступным для записи корнем внутри chroot()", 58) = 58
[pid 27164] 18:31:56.250436 write(0, "\r\n", 2) = 2
[pid 27164] 18:31:56.250758 exit_group(2) = ?
Таким образом, решение заключалось в chmod 500 ~ftptest/public_html
, но это могло быть что угодно другое, strace
в данном случае действительно помог найти проблему.
Ответ или решение
Ошибки при установлении FTPS-соединения часто возникают из-за неправильных конфигураций на сервере или клиента. В вашем случае, сообщение об ошибке "wrong version number" указывает на проблемы с TLS-соединением. Давайте рассмотрим возможные причины и решения этой ошибки более внимательно.
1. Изменение конфигурации vsftpd
Во-первых, убедитесь, что ваш сервер FTP (vsftpd) настроен на поддержку TLS и правильно сконфигурирован. Для этого добавьте или обновите следующие строки в файле конфигурации vsftpd (/etc/vsftpd/vsftpd.conf
):
listen=YES
ssl_enable=YES
force_local_data_ssl=YES
force_local_logins_ssl=YES
allow_anon_ssl=NO
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_tlsv1=YES
ssl_tlsv1_1=YES
ssl_tlsv1_2=YES
Проверьте, что путь к сертификату и закрытому ключу правильный и эти файлы существуют. Также убедитесь, что права на эти файлы настроены корректно для пользователя, под которым работает vsftpd.
2. Чертеж безопасности (chroot)
Вы указали, что используете конфигурацию chroot для локальных пользователей. Однако важно, чтобы корень в этом chroot-окружении не был доступен для записи. Ваша проблема с ошибкой, связанной с записью в корневую директорию chroot, может вызвать проблемы с FTPS.
Определяя chroot_local_user=YES
, убедитесь, что каталог, к которому вы привязываете пользователя (local_root=public_html
), имеет права доступа, которые предотвращает запись в корневую директорию (например, выполните chmod 500 ~ftptest/public_html
, как вы уже сделали).
3. Отладка через strace
Отладка через strace
– это эффективный метод выявления причин проблем. В вашем случае вывод strace
указал на ошибку, связанную с правами доступа:
vsftpd: refusing to run with writable root inside chroot()
Это подсказывает, что проблема была в несанкционированном доступе. strace
— это мощный инструмент, который может помочь выявить проблемы, которые не всегда очевидны через журналы или стандартные методы диагностики.
4. Проверка TLS-Ver версии
Попробуйте проверить поддерживаемые версии TLS на вашей системе, используя openssl
. Это поможет убедиться, что проблема не связана с недоступной версией SSL/TLS. Например, выполните следующий команду:
openssl s_client -connect ec2-myserver.compute.amazonaws.com:21 -starttls ftp
И убедитесь, что в выводе не возникает ошибок, связанных с версиями TLS.
5. Проверка сети и брандмауэра
Убедитесь, что ваш сервер EC2 настроен для разрешения входящих и исходящих подключений на порты, необходимые для FTPS (обычно 21, 990, а также диапазон портов для пассивного FTP). Также убедитесь, что настройки брандмауэра вашего EC2 экземпляра (Security Groups) позволяет трафик.
Заключение
Если после выполнения всех рекомендаций ошибка "wrong version number" сохраняется, возможно, стоит проверить совместимость клиента curl
с сервером. Убедитесь, что вы используете последнюю версию curl
, которая поддерживает те же протоколы TLS и может работать с FTPS. Также попробуйте использовать различные флаги и параметры команды curl
, такие как --ftp-ssl
или --ftp-ssl-reqd
для явного указания на использование FTPS.
Эти советы должны помочь вам диагностировать и решить проблему с установлением FTPS-соединения с использованием curl
. Убедитесь, что все изменения и настройки протестированы на предмет корректности перед развертыванием в производственной среде.