Сохранить сертификат для использования с lftp
Как я могу сохранить сертификат для использования с lftp?
Данный сертификат не принимается lftp при загрузке с сервера. Я старался
openssl s_client -connect {HOSTNAME}:21 -showcerts
Как сохранить сертификат SSL удаленного сервера локально в виде файла, но это возвращает
CONNECTED(00000003) 3074045628:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:766:
no peer certificate available
Я соединяюсь с
lftp -p 21 -u {USER} {HOSTNAME}
и получить
ls: Fatal error: Certificate verification: Not trusted
4 ответа
Я думаю, что проблема здесь в том, что FTP-сервер использует обычный FTP, но поддерживает явный SSL/TLS. Таким образом, чтобы следовать протоколу, клиент должен подключиться к FTP-серверу и запустить шифрование с помощью команды AUTH. (Команда AUTH отправляется в виде простого текста)
Поэтому, чтобы ответить на ваш вопрос, я не думаю, что можно показать сертификат. Если только вы не можете каким-то образом отправить команду AUTH на FTP-сервер.
Изменить: Для отображения сертификатов выполните следующие действия:
openssl s_client -connect xxxx:21 -starttls ftp
Похоже, что lftp не настроен правильно на многих системах, что делает невозможным проверку сертификатов сервера. Может быть, это основная причина вашей проблемы.
В Интернете полно предложений, как это исправить, отключив проверку сертификата или шифрование. Это небезопасно, поскольку позволяет атакам типа "человек посередине" проходить незамеченным.
Лучшее решение - правильно настроить проверку сертификата, что, к счастью, просто. Для этого добавьте следующую строку в /etc/lftp.conf
(или в качестве альтернативы ~/.lftp/rc
):
set ssl:ca-file "/etc/ssl/certs/ca-certificates.crt"
ca-certificates.crt
это файл, который содержит все сертификаты CA системы. Местоположение, используемое выше, является тем из Ubuntu и может отличаться в разных системах. Чтобы сгенерировать или обновить файл, запустите update-ca-certificates
:
sudo update-ca-certificates
Если ваша система не имеет этой команды, вы можете создать ее вручную следующим образом:
cat /etc/ssl/certs/*.pem | sudo tee /etc/ssl/certs/ca-certificates.crt > /dev/null
Предупреждение: другие ответы здесь разрушают безопасность соединения
Все ответы, предлагающие отключить проверку сертификатов, определенно ослабляют безопасность, поскольку делают соединение уязвимым для атак типа "злоумышленник в середине".
Ответьте, что сохраните безопасность здесь
Этот вопрос доверяет сертификату сервера с lft p и упоминает этот комментарий FTP SSL/TLS-сертификат обработки #214 на сайте lftp github, который выглядит намного лучше.
Укороченная версия
set ssl:verify-certificate/FI:NG:ER:PR:IN:T:HE:RE no
Полная, протестированная, рабочая, версия
Для интерактивных занятий
Пароль будет запрошен в интерактивном режиме:
lftp -e "set ssl:verify-certificate/4E:6F:74:20:72:65:61:6C:20:66:69:6E:67:65:72:70:72:69:6E:74 no ; open user@machine.domaine.name"
Для сеансов без присмотра
- введите пароль в
~/.netrc
файл - обратите внимание, что синтаксис
open myspecificuser@machine.domaine.name
внутри команд, а неlftp myspecificuser@machine.domaine.name
-c
вместо-e
выполнит полную команду, затем выйдет из lftp, в качестве альтернативы добавит; quit
.
lftp -c "set ssl:verify-certificate/4E:6F:74:20:72:65:61:6C:20:66:69:6E:67:65:72:70:72:69:6E:74 no ; open myspecificuser@machine.domaine.name ; cd /some/path/on/server ; mirror "
Содержание
~/.netrc
:
machine machine.domaine.name login myspecificuser password my-specific-password-not-this-one-of-course
Вы уверены, что эта конечная точка правильно защищена с помощью SSL? Из сообщения об ошибке вы видите, что сервер не предоставляет ssl? Кроме того, порт 21 в основном используется для обычного FTP, а не для FTP или SFTP.
Это то, что я получаю, когда запускаю команду на обычном FTP-сервере.
openssl s_client -connect xxx.yyy.zzz.www:21 -showcerts
CONNECTED(00000003)
140165093090976:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:749:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 225 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
Ошибка lftp может быть из-за неправильной конфигурации lftp, где вам требуется ssl. Вы можете попробовать следующее:
set ftp:ssl-force false
В любом случае вы также можете попробовать подключение с помощью
set ssl:verify-certificate no
Хотя это приемлемо только для тестирования и с тестовыми учетными записями (чтобы не пропускать учетные данные)
В моем случае проблема была вызвана тем, что сервер поддерживает только устаревшие версии TLS, которые не поддерживаются современными дистрибутивами.
Проверьте, можете ли вы соединиться с openssl:
$ openssl s_client -starttls ftp -connect <hostname>:21
CONNECTED(00000003)
140140192228416:error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol:../ssl/statem/statem_lib.c:1940:
---
<remaining text snipped>
Эта ошибка объясняется здесь: https://stackoverflow.com/a/53065682/1878199, tl; dr; Debian теперь требует как минимум TLS 1.2.
Вы можете проверить, что поддерживает ваш сервер, используя nmap:
$ nmap --script ssl-enum-ciphers -p 21 <hostname>
PORT STATE SERVICE
21/tcp open ftp
| ssl-enum-ciphers:
| SSLv3:
| ciphers:
| TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 2048) - A
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 2048) - A
| TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA (dh 2048) - A
| TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA (dh 2048) - A
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| CBC-mode cipher in SSLv3 (CVE-2014-3566)
| TLSv1.0:
| ciphers:
| TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 2048) - A
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 2048) - A
| TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA (dh 2048) - A
| TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA (dh 2048) - A
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
| compressors:
| NULL
| cipher preference: client
|_ least strength: A
(См. Также https://security.stackexchange.com/a/70737)
Так что мой сервер принимает только TLSv1.0. Конечно, правильное решение - обновить сервер!
Возможные решения на стороне клиента:
- Использовать SSL
$ lftp -e "set ftp:ssl-auth SSL" <hostname>
- Отключить SSL для этого соединения
lftp -e "set ftp:ssl-allow no" <hostname>
- Вы также можете попробовать включить устаревшие протоколы на вашем клиенте, отредактировав
/etc/ssl/openssl.cnf
как описано в первой ссылке выше. Не рекомендуется.