Вопрос или проблема
В нашей компании используется веб-прокси, который разрывает 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. Предлагаю выполнять проверки и настройки последовательно, чтобы изолировать источник проблемы. Поскольку система сертификатов является критически важной для безопасности, убедитесь, что все изменения тестируются в безопасной среде.
Надеюсь, это руководство поможет вам разобраться с вопросом. Если у вас возникнут дополнительные вопросы, не стесняйтесь их задавать.