Вопрос или проблема
Мы недавно обновились с RHEL7 до RHEL8, и одной из проблем, которую было нелегко решить, является использование cURL с клиентскими сертификатами после того, как cURL убрал поддержку NSS?
Ранее cURL просто работал, основываясь на том, что мы уже импортировали клиентские сертификаты в Firefox или Chrome, которые использовали nssdb. cURL имел доступ к nssdb и мог выбирать сертификат, хранящийся в базе данных.
После обновления до RHEL8 мы в конечном итоге обнаружили, что это больше не вариант. Запуск curl -vv ...
показывал вывод вроде Инициализация NSS с certpath: ...
и NSS: использование клиентского сертификата: ...
на RHEL7, но на RHEL8 никакого упоминания о NSS.
В ходе исследования я нашел обсуждения в почтовых рассылках и pull request, указывающие на его упразднение в августе 2023 года.
Теперь, когда эта поддержка исчезла, какие есть альтернативы для доступа к URL, которые защищены PKI с помощью больше недоступной пары cURL NSS, будь то скрипты или командная строка?
Ранее я рассматривал python requests, но это не позволяет передать пароль к P12 файлу, что оставляет возможность распаковать P12 в незашифрованный ключ/сертификат, если это должно быть автоматизировано.
Спасибо всем!
Ответ или решение
С переходом с RHEL7 на RHEL8 действительно возникли изменения в поддержке клиентских сертификатов в cURL, в частности, в связи с удалением поддержки NSS (Network Security Services). Для решения этой проблемы и успешного использования клиентских сертификатов, предлагаю рассмотреть несколько альтернативных подходов.
1. Использование cURL с PEM файлами
Теперь, когда NSS не поддерживается, наиболее простым решением является использование формата PEM для хранения сертификатов и ключей. Вам нужно будет экспортировать ваши сертификаты из NSS в формате PEM. Вы можете воспользоваться следующими шагами:
-
Экспорт сертификатов и ключей:
Используйте инструменты, такие какcertutil
, для экспорта сертификатов из хранилища NSS:certutil -L -d /path/to/nssdb -n "Your Certificate Name" -a > client-cert.pem certutil -K -d /path/to/nssdb > client-key.pem
-
Запуск cURL с использованием PEM файлов:
После того как сертификаты экспортированы, вы можете использовать cURL следующим образом:curl --cert client-cert.pem --key client-key.pem https://your.url
2. Использование OpenSSL
Если у вас есть клиентский сертификат в формате P12 (PKCS#12), вы можете конвертировать его в формат PEM:
openssl pkcs12 -in client-cert.p12 -out client-cert.pem -nodes
После конвертации вы можете использовать полученные файлы в cURL, как указано выше.
3. Использование Python и библиотеки requests
Хотя вы упомянули о проблемах с передачей пароля на P12 файл в библиотеке requests
, можно рассмотреть следующий способ:
Вы можете распаковать P12 файл в PEM файл и использовать его с requests
, или использовать встроенные функции для работы с P12:
import requests
# Загрузка P12 сертификата
from OpenSSL import crypto
p12 = crypto.load_key(crypto.FILETYPE_PEM, open('client-cert.p12').read(), b'password')
# Выполните аутентификацию с помощью requests
response = requests.get('https://your.url', cert=('client-cert.pem', 'client-key.pem'))
4. Альтернативные инструменты
Существуют и другие инструменты для работы с клиентскими сертификатами, которые могут подойти для вашей задачи:
-
HTTPie: Это более удобная альтернатива cURL, которая также поддерживает клиентские сертификаты.
-
Wget: другой инструмент командной строки, который также позволяет использовать клиентские сертификаты в PEM формате.
Заключение
Теперь, когда поддержка NSS в cURL была удалена, использование PEM файлов является наиболее взвешенным и универсальным решением для работы с клиентскими сертификатами. Обязательно тестируйте любые изменения в вашем окружении, чтобы убедиться в их работоспособности и безопасности.