Как использовать клиентские сертификаты после того, как cURL убрал поддержку NSS

Вопрос или проблема

Мы недавно обновились с 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. Вы можете воспользоваться следующими шагами:

  1. Экспорт сертификатов и ключей:
    Используйте инструменты, такие как 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
  2. Запуск 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 файлов является наиболее взвешенным и универсальным решением для работы с клиентскими сертификатами. Обязательно тестируйте любые изменения в вашем окружении, чтобы убедиться в их работоспособности и безопасности.

Оцените материал
Добавить комментарий

Капча загружается...