Вопрос или проблема
У меня есть небольшой initramfs с встроенным статическим busybox. Единственная цель этого initramfs – загружать/выгружать файлы на HTTPS-сервер.
У меня есть правильный сертификат и учетные данные для этого. Но когда я выполняю команду:
curl --cacert /tmp/filename.pem -T /tmp/file_to_upload -u user:pass https://Server_name/
Я получаю ошибку:
curl: (60) Проблема с SSL-сертификатом: невозможно получить локальный сертификат удостоверяющего центра
Если я использую ту же команду с тем же сертификатом на Ubuntu, то все работает гладко.
Как мне решить эту проблему?
ИЗМЕНЕНИЕ: Я не хочу использовать флаг “-k” или “–insecure”
ПРИМЕЧАНИЕ: У меня нет openssl или каталога /etc/ssl в initramfs
Поскольку у вас нет /etc/ssl, я советую добавить опцию curl
-k в вашу команду.
-k, –insecure
(SSL) Эта опция явно позволяет curl выполнять “незащищенные”
SSL-соединения и передачи. Все SSL-соединения пытаются установить безопасное соединение с использованием установленного по умолчанию пакета CA сертификатов. Это делает все соединения, которые считаются “незащищенными”, неудачными, если не используется -k, –insecure.
С учетом вашего изменения, что вы не хотите -k, другой вариант – создать /etc/ssl/certs и добавить в него корневые сертификаты, поддерживающие цепочку доверия к вашему сертификату. Однако для этого вам нужно установить openssl или хотя бы иметь файл конфигурации /etc/ssl/openssl.cnf
.
Третий вариант – просто объединить в “filename.pem” все необходимые сертификаты, чтобы завершить цепочку доверия в порядке важности (т.е. если есть промежуточные ЦА, корневой ЦА идет последним). Это работает в некоторых программных настройках (Apache, FreeRadius, я никогда лично не пробовал с curl).
Ответ или решение
Проблема с SSL сертификатом: невозможно получить локальный сертификат удостоверяющего центра
Ваш случай использования curl
в статическом initramfs
с BusyBox указывает на определенные сложности при установлении безопасного HTTPS-соединения. Ошибка, с которой вы столкнулись:
curl: (60) SSL certificate problem: unable to get local issuer certificate
указывает на то, что curl
не может проверить действительность SSL-сертификата сервера из-за отсутствия цепочки доверия, что, в свою очередь, связано с отсутствующими промежуточными или корневыми сертификатами на вашей системе.
Причины проблемы
- Отсутствие корневых сертификатов: На вашей системе отсутствуют необходимые корневые и промежуточные сертификаты для верификации сервера.
- Статичная среда: Вы используете статический
initramfs
, который по умолчанию не включает библиотеку OpenSSL и директорию/etc/ssl
, что делает невозможным использование стандартных механизмов для проверки сертификатов.
Решения
Для решения данной проблемы, следует рассмотреть несколько подходов:
-
Конкатенация сертификатов:
Вы можете попробовать объединить ваш сертификат с необходимыми корневыми и промежуточными сертификатами в один файл. Убедитесь, что порядок сертификатов в файле соответствует правилам (корневой CA в конце). Это может выглядеть следующим образом:cat intermediate.pem >> filename.pem cat root.pem >> filename.pem
Затем выполните ту же команду
curl
, указав обновленный файл:curl --cacert /tmp/filename.pem -T /tmp/file_to_upload -u user:pass https://Server_name/
-
Добавление сертификатов в файловую систему:
Если возможно, добавьте необходимые корневые сертификаты в папку/etc/ssl/certs
. Однако для выполнения этого может потребоватьсяopenssl
, так как необходимо правильно организовать сертификаты и создать файл конфигурации/etc/ssl/openssl.cnf
, который будет содержать требуемые параметры для проведения верификации. -
Перенос OpenSSL:
Еслиopenssl
отсутствует в вашей среде, рассмотрите возможность добавления минимально необходимой версииopenssl
и соответствующих динамических библиотек в вашеinitramfs
. Это позволит использовать стандартные механизмы для работы с сертификатами и упрощение их верификации.
Заключение
Даже несмотря на ваши предпочтения не использовать опцию -k
или --insecure
, использование этой опции может быть временным решением в случае крайней необходимости, но я настоятельно рекомендую решить проблему с верификацией сертификатов. Убедитесь, что у вас есть все необходимые сертификаты для успешного завершения HTTPS-запросов. Создание полноценной цепочки доверия между вашим клиентом и сервером обеспечит безопасность ваших данных и защитит от атак типа "человек посередине".