Сохранить сертификат для использования с 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. Конечно, правильное решение - обновить сервер!

Возможные решения на стороне клиента:

  1. Использовать SSL $ lftp -e "set ftp:ssl-auth SSL" <hostname>
  2. Отключить SSL для этого соединения lftp -e "set ftp:ssl-allow no" <hostname>
  3. Вы также можете попробовать включить устаревшие протоколы на вашем клиенте, отредактировав /etc/ssl/openssl.cnf как описано в первой ссылке выше. Не рекомендуется.
Другие вопросы по тегам