cURL не распознает сертификат

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

В нашей компании используется веб-прокси, который разрывает SSL-соединения и заменяет сертификат на свой собственный поддельный сертификат. (Точнее, он использует прокси-сертификат, подписанный корпоративным сертификатом.)

Чтобы загрузить с https URL, мне нужно заставить свою систему доверять этому поддельному сертификату (или отключить проверку сертификатов).

Я добавил как прокси-сертификат, так и корпоративный сертификат в оба /etc/ssl/certs/ca-bundle.crt и /etc/ssl/certs/ca-certificates.crt. (Оба ссылаются на один и тот же файл.)

Теперь загрузка с помощью wget работает нормально, однако загрузка с использованием curl не работает, потому что curl не может проверить сертификат:

* Пересобранный URL: https://company.net/
* Имя хоста НЕТ найдено в DNS-кэше
*   Попытка 172.18.111.111...
* Подключено к 172.18.111.111 (172.18.111.111) порт 3128 (#0)
* Установлен HTTP-прокси-тоннель к company.net:443
> CONNECT company.net:443 HTTP/1.1
> Host: company.net:443
> User-Agent: curl/7.39.0
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 Соединение установлено
<
* Прокси ответил OK на запрос CONNECT
* успешно установлены локации для проверки сертификатов:
*   CAfile: /etc/ssl/certs/ca-bundle.crt
  CApath: none
* SSLv3, TLS рукопожатие, Приветствие клиента (1):
* SSLv3, TLS рукопожатие, Приветствие сервера (2):
* SSLv3, TLS рукопожатие, СЕРТ (11):
* SSLv3, TLS оповещение, Приветствие сервера (2):
* Проблема с SSL сертификатом: самоподписанный сертификат в цепочке сертификатов
* Закрытие соединения 0
curl: (60) Проблема с SSL сертификатом: самоподписанный сертификат в цепочке сертификатов

Что может быть не так? Как я могу дальше отладить?

Вам нужно сообщить nix о сертификатах, вот так:

security.pki.certificates = [''строки сертификатов идут сюда в формате PEM''];

То есть:

 security.pki.certificates = [
    ''

      -----BEGIN CERTIFICATE-----
<УБРАНО>
      -----END CERTIFICATE-----
    ''
 ];

Вы можете добавить их много, если хотите. Это добавит включенные сертификаты в хранилище сертификатов системы, и тогда curl должен использовать их без дополнительных аргументов командной строки.

Ответ или решение

Проблема с распознаванием сертификатов в cURL

В вашей ситуации проблема с cURL заключается в том, что он не может проверить SSL-сертификат, выданный вашим прокси, из-за того, что он является самоподписанным. Вот детальный анализ проблемы и пути ее решения.

1. Описание проблемы

Компания приняла решение использовать веб-прокси, который подменяет SSL-сертификаты на свои собственные, созданные на основе сертификатов компании. Для работы с HTTPS-URL вам нужно сделать так, чтобы ваша система доверяла этому «поддельному» сертификату.

Вы уже предприняли шаги по добавлению сертификатов в файлы /etc/ssl/certs/ca-bundle.crt и /etc/ssl/certs/ca-certificates.crt. Тем не менее, несмотря на то, что wget работает корректно, cURL все равно выдает ошибку:

SSL certificate problem: self signed certificate in certificate chain

2. Причины проблемы

Ошибка, с которой вы столкнулись, возникает из-за того, что cURL не может найти доверенный сертификат в цепочке сертификатов, что приводит к ее недействительности. Вот несколько причин, по которым это может происходить:

  • Кеширование: cURL может использовать кешированные сертификаты, которые не обновлены.
  • Версия cURL: Ваша версия cURL (7.39.0) может быть устаревшей. Возможно, стоит провести обновление до более новой версии.
  • Отсутствие доверенных корневых сертификатов: Если сертификат вашего прокси не установлен правильно или отсутствует в системе, cURL не сможет его распознать.

3. Способы решения проблемы

3.1 Проверка сертификатов

Убедитесь, что ваш прокси-сертификат корректно установлен. Чтобы проверить это, выполните следующие шаги:

  • Проверьте, что ваш сертификат действительно добавлен в файлы /etc/ssl/certs/ca-bundle.crt и /etc/ssl/certs/ca-certificates.crt. Вы можете использовать команду openssl для просмотра содержимого загруженных сертификатов. Например:
    openssl x509 -in /etc/ssl/certs/ca-bundle.crt -text -noout
3.2 Обновление cURL

Проверьте доступные обновления для cURL. Вы можете обновить его через пакетный менеджер вашей системы, например:

sudo apt-get update
sudo apt-get install curl
3.3 Настройка cURL для использования других сертификатов

Если проблема не решается, вы можете явно указать cURL использовать определенный файл сертификата. Например:

curl --cacert /path/to/your/proxy-certificate.pem https://company.net/
3.4 Настройка хранилища сертификатов в Nix

Если вы используете Nix, убедитесь, что добавили ваши сертификаты в конфигурацию NixOS следующим образом:

security.pki.certificates = [
  ''
    -----BEGIN CERTIFICATE-----
    <CUT>
    -----END CERTIFICATE-----
  ''
];

Это обеспечит правильное обнаружение сертификатов cURL.

4. Заключение

Учитывая описанные шаги, вы сможете устранить проблему с распознаванием сертификатов в cURL. Предлагаю выполнять проверки и настройки последовательно, чтобы изолировать источник проблемы. Поскольку система сертификатов является критически важной для безопасности, убедитесь, что все изменения тестируются в безопасной среде.

Надеюсь, это руководство поможет вам разобраться с вопросом. Если у вас возникнут дополнительные вопросы, не стесняйтесь их задавать.

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

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