Вопрос или проблема
При подключении к серверу с помощью lftp у меня возникла следующая проблема:
Проверка сертификата: Не доверяется: не найден поставщик (AA:AA:AA:[...]:AA:AA)
Это как минимум указывает на то, что проверка сертификата не удалась. Я хотел бы добавить этот сертификат в белый список. Очевидно, отключение проверки сертификатов не является вариантом из-за соображений безопасности.
Вот что я уже пробовал:
- Следуя этому руководству, чтобы получить сертификаты с сервера и использовать их с
set ssl:ca-file
. Согласно этому руководству, у меня есть три сертификата. Я попробовал их все, затем объединил их вместе, что ничего не изменило. Также пробовал сssl:cert-file
. - Используя тот же метод, что и выше с
openssl s_client -connect my.server.tld:21 -starttls ftp
, который выдает только один сертификат - Установив
ssl:ca-file
на хранилище CA системы - Использование gnutls-cli работает отлично с опцией -s, так же как и вышеупомянутые команды
openssl s_client
.
Сертификат, похоже, подписан действительной цепочкой доверия, насколько это сообщают команды.
Filezilla работает отлично, но выводит следующее предупреждение, которое может быть связано:
Сервер отправил несортированную цепочку сертификатов, нарушающую спецификации TLS
Я не контролирую сервер, так как не хостирую его сам, но приветствование идентифицирует себя как Pure-FTPd.
Другие клиенты, которые не работали (недостаток поддержки ftps или для конкретного сервера): ftp
, ncftp
, dolphin (KIO)
, curlftpfs
, tnftp
, firefox
Единственное решение через год остается отключение ssl:verify-certificate для конкретных отпечатков сертификатов.
set ssl:verify-certificate/{fingerprint1} no
set ssl:verify-certificate/{fingerprint2} no
Смотрите закрытую проблему lftp 214 — https://github.com/lavv17/lftp/issues/214#issuecomment-197237482
Что сработало для меня шаг за шагом с lftp:
- Получить сертификат хоста с помощью
openssl s_client -connect <ftp_hostname>:21 -starttls ftp
, в начале результата я получил что-то вроде-----BEGIN CERTIFICATE-----
MIIEQzCCAyu.....XjMO
-----END CERTIFICATE----- - Скопировать этот
-----BEGIN CERTIFICATE-----
в
MIIEQzCCAyu.....XjMO
-----END CERTIFICATE-----/etc/ssl/certs/ca-certificates.crt
- В конфигурации lftp указать этот файл сертификата, добавив в
/etc/lftp.conf
для системыset ssl:ca-file "/etc/ssl/certs/ca-certificates.crt"
- А затем выполните вашу синхронизацию или что-то еще с помощью
lftp
, в моем случае этоlftp -u "${FTP_USER},${FTP_PWD}" ${FTP_HOST} -e "set net:timeout 10;mirror ${EXCLUDES} -R ${LOCAL_SOURCE_PATH} ${REMOTE_DEST_PATH} ; quit"
Решением для меня было получить все сертификаты из команды ниже и добавить их в файл сертификатов.
openssl s_client -connect hg-gym.de:21 -starttls ftp -showcerts
На моей системе (Linux Mint), чтобы выполнить клиент lftp с проверкой SSL сертификата сервера, мне пришлось выполнить следующие шаги:
- Скачать сертификат с FTP сервера с помощью следующей команды:
openssl s_client -connect x.x.x.x:21 -starttls ftp
где x.x.x.x
– это IP-адрес FTP-сервера. Ответ на запрос содержит много информации. Меня интересует только часть ответа, содержащаяся между 2 строками BEGIN CERTIFICATE
и END CERTIFICATE
:
-----BEGIN CERTIFICATE-----
...
...
-----END CERTIFICATE-----
-
Я скопировал предыдущие 2 строки и все строки, ограниченные ними, в конец файла
/etc/ssl/certs/ca-certificates.crt
(отредактировать с помощью команды sudo).ca-certificates.crt
– это файл, который содержит все CA сертификаты системы. Указанное выше местоположение относится к Linux Mint/Ubuntu и может варьироваться на разных системах. -
Я добавил строку:
set ssl:check-hostname no
в файл /etc/lftp.conf
(с помощью sudo); это предотвращает ошибку:
Серьезная ошибка: Проверка сертификата: общее имя сертификата не соответствует запрашиваемому имени хоста ‘<ftp-hostname>’
С предыдущими шагами lftp
проверяет SSL сертификат. Например, чтобы загрузить файл на сервер FTP через FTP с использованием TLS, я могу использовать следующую команду:
> lftp
lftp :~> source lftps_config
lftp <username>@<ftp-ipaddress>:~> mput test.txt
64 байта передано
lftp <username>@<ftp-ipaddress>
где lftps_config
– это следующий файл:
set ftp:ssl-protect-data true;
set ftp:ssl-auth TLS
open ftp://<ftp-ipaddress>:<ftp-port>
user <username> <password>
Ответ или решение
При использовании клиента lftp для подключения к FTP-серверу с поддержкой TLS/SSL вы можете столкнуться с проблемой проверки сертификата, которая может выглядеть следующим образом:
Certificate verification: Not trusted: no issuer was found (AA:AA:AA:[...]:AA:AA)
Это сообщение указывает на то, что lftp не может проверить сертификат сервера из-за отсутствия доверенного корневого сертификата. В данной статье мы рассмотрим, как добиться успешной проверки сертификата сервера, сохраняя при этом высокие стандарты безопасности.
Шаги решения проблемы с сертификатом
-
Получение сертификата сервера
Используйте команду OpenSSL для получения сертификата с FTP-сервера. Выполните следующую команду в терминале:
openssl s_client -connect your.server.com:21 -starttls ftp -showcerts
Обратите внимание на вывод команды. Вам нужно будет сфокусироваться на блоках, содержащих строки
-----BEGIN CERTIFICATE-----
и-----END CERTIFICATE-----
. Скопируйте эти строки вместе с самим сертификатом. -
Добавление сертификата в системное хранилище
Вам необходимо добавить полученный сертификат в файл доверенных корневых сертификатов вашей системы. В большинстве систем Linux это файл
/etc/ssl/certs/ca-certificates.crt
. Чтобы сделать это, выполните следующие шаги:sudo nano /etc/ssl/certs/ca-certificates.crt
Вставьте скопированный сертификат в конец файла и сохраните изменения.
-
Настройка конфигурации lftp
Откройте файл конфигурации lftp, который обычно находится по пути
/etc/lftp.conf
, и добавьте следующую строку, указывающую на файл сертификатов:set ssl:ca-file "/etc/ssl/certs/ca-certificates.crt"
Так вы укажете lftp использовать доверенное хранилище сертификатов.
-
Дополнительные параметры конфигурации
Возможно, вам также потребуется отключить проверку имени хоста, если вы получаете ошибки о несоответствии общего имени сертификата и имени хоста. Для этого добавьте:
set ssl:check-hostname no
-
Использование lftp для подключения к серверу
После завершения всех настроек, вы можете попробовать подключиться к серверу, используя следующую команду:
lftp -u "${FTP_USER},${FTP_PWD}" ${FTP_HOST} -e "set net:timeout 10; mirror ${EXCLUDES} -R ${LOCAL_SOURCE_PATH} ${REMOTE_DEST_PATH}; quit"
Заключение
Использование правильной конфигурации сертификатов для lftp позволит вам установить безопасное соединение без отключения проверки сертификатов, что критически важно для обеспечения безопасности ваших данных. Если все вышеперечисленные шаги выполнены правильно, lftp должен установить соединение без ошибок, связанных с ненадежными сертификатами. В случае, если ошибка продолжает возникать, убедитесь, что на сервере установлен правильный и полный сертификат, а также правильная цепочка доверия.
Следуя данным рекомендациям, вы сможете успешно настроить lftp для безопасного взаимодействия с FTP-сервером, что является важным аспектом для обеспечения безопасности ваших файлов и данных в процессе их передачи.