#Что означает ошибка
curl: (60) SSL certificate problem: unable to get local issuer certificate
curl: (60) SSL certificate problem: unable to get local issuer certificate (или self-signed certificate, certificate has expired) означает, что curl не смог проверить сертификат сервера. Причины: устаревший или отсутствующий пакет CA, неполная цепочка на сервере, самоподписанный сертификат, перехват трафика прокси, неверное время.
Ключ -k отключает проверку и не должен использоваться вместо исправления.
Найдите причину с помощью подробного вывода.
curl не доверяет сертификату сайта: отсутствуют корневые сертификаты в системе, сервер не отдаёт промежуточные сертификаты либо трафик перехватывается. Не отключайте проверку без необходимости.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Нет пакета ca-certificates | Минимальная система. | Установите. |
| Устаревшие корневые сертификаты | Давно не обновляли. | Обновите. |
| Сервер без цепочки | Только один сайт. | Владельцу: исправить. |
| Перехват трафика | Корпоративный прокси. | Добавьте корневой сертификат. |
#Пошаговое решение
- Запустите curl -vНа Linux/macOS откройте «Терминал» и выполните
curl -vI https://example.com/, заменив адрес своим сайтом. В Windows используйтеcurl.exe -vI https://example.com/в PowerShell, чтобы исключить различия псевдонимов. Смотрите строки с ошибкой проверки сертификата и цепочкой доверия, но не вводите-kили--insecure: они скрывают проблему. Если ошибка проявляется только на клиенте, сравните установленный набор доверенных центров; если у всех — проверяйте конфигурацию сервера. - Проверьте сертификат openssl s_clientВ браузере откройте сайт, нажмите значок сведений о соединении возле адреса и посмотрите информацию о сертификате (название меню зависит от браузера). Сравните доменное имя в сертификате, срок действия и название издателя с адресной строкой. При предупреждении о недоверенном сертификате не нажимайте обход предупреждения и не отправляйте пароли; администратору сайта передайте точный текст ошибки и имя домена. Если проблема только в корпоративной сети, уточните у администратора политику доверия.
- Проверьте полную цепочку на сервереАдминистратору своего HTTPS-сервера: в терминале выполните
openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/nullс реальным доменом. Посмотрите, передаётся ли промежуточный сертификат и нет лиVerify return codeс ошибкой проверки. Публичный сайт можно дополнительно проверить в SSL Labs. При недостающей цепочке настройте на сервере корректный файл fullchain от издателя и проверьте синтаксис конфигурации; посетитель не должен добавлять непонятный сертификат в доверенные. - Обновите ca-certificates на клиентеТолько если сертификат сервера проверен и выяснилось, что у конкретного Linux-клиента устарели доверенные корни: в Debian/Ubuntu выполните
sudo apt updateиsudo apt install --only-upgrade ca-certificates, затемsudo update-ca-certificates. Для других дистрибутивов используйте их штатный менеджер пакетов. Повторитеcurl -I https://example.com/без-k. Если ошибка остаётся у нескольких независимых клиентов, вероятнее неполная цепочка на самом сервере.Linux · Терминал (Bash)КомандаНужен sudoОбновление хранилища сертификатов.sudo update-ca-certificates - Добавьте свой CA вместо -kВнутренний сервер с собственным центром сертификации допускает явное доверие только проверенному по независимому каналу CA. Администратор должен передать сертификат центра, а не закрытый ключ, и подтвердить его отпечаток. Для разового теста можно выполнить
curl --cacert /путь/к/проверенному-ca.pem -I https://internal.example/, заменив оба пути на реальные. Не используйтеcurl -kи не добавляйте неизвестные CA в системное хранилище: это ослабляет защиту всех HTTPS-соединений.
#Если не помогло
Параметр -k (--insecure) отключает проверку сертификата и допустим только для отладки.
#Диагностика
Выполните curl -v https://host и посмотрите блок SSL certificate verify. Проверьте сертификат: echo | openssl s_client -connect host:443 -servername host 2>/dev/null | openssl x509 -noout -issuer -subject -dates. Проверьте цепочку на : сообщение «Chain issues: Incomplete» — на сервере не хватает промежуточного сертификата. Проверьте дату на своей машине.
#Клиент
Обновите CA: Debian/Ubuntu — sudo apt install --reinstall ca-certificates && sudo update-ca-certificates; RHEL/Rocky — sudo dnf reinstall ca-certificates && sudo update-ca-trust; Windows — обновите систему и корневые сертификаты. Для собственного CA добавьте его: скопируйте .crt в /usr/local/share/ca-certificates/ и update-ca-certificates (Debian) либо /etc/pki/ca-trust/source/anchors/ и update-ca-trust (RHEL). Разово: curl --cacert ca.pem https://host.
#Сервер и прокси
Владелец сервера должен отдавать полную цепочку: в nginx ssl_certificate fullchain.pem. Самоподписанные сертификаты для публичных сервисов замените на Let's Encrypt. За корпоративным прокси экспортируйте корневой сертификат организации и укажите CURL_CA_BUNDLE или --cacert. Не используйте curl -k в скриптах: так вы теряете защиту от подмены. Для тестов на своём стенде допустимо, но осознанно.
curl -v https://example.comecho | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -issuer -subject -dates