Ошибка SSL certificate problem: unable to get local issuer certificate (или её варианты) — одна из самых частых проблем при разработке. Она означает, что инструмент не может проверить цепочку сертификатов сервера — обычно потому, что корневые сертификаты удостоверяющих центров в вашей системе устарели или отсутствуют.
Это руководство содержит правильные исправления — а не просто обходные пути с -k / --insecure, которые отключают безопасность.
Основная причина
Ваши инструменты проверяют SSL-сертификаты по набору сертификатов удостоверяющих центров (CA bundle) — файлу, содержащему доверенные корневые сертификаты. Когда этот набор устарел, отсутствует или сервер имеет неполную цепочку, проверка завершается неудачей.
Ваш инструмент → "Этот сертификат подписан доверенным удостоверяющим центром?"
CA bundle → "У меня нет корневого сертификата этого удостоверяющего центра"
→ ОШИБКА: unable to get local issuer certificate
curl
Ошибка
curl: (60) SSL certificate problem: unable to get local issuer certificate
Исправление 1: Обновите сертификаты удостоверяющих центров (правильное решение)
# Debian/Ubuntu
sudo apt update && sudo apt install ca-certificates
sudo update-ca-certificates
# CentOS/RHEL
sudo yum update ca-certificates
# macOS (Homebrew curl)
brew install ca-certificates
Исправление 2: Укажите путь к набору сертификатов
curl --cacert /etc/ssl/certs/ca-certificates.crt https://example.com
Исправление 3: Установите переменную окружения
export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
Не делайте так (если только не тестируете)
curl -k https://example.com # Отключает ВСЮ проверку сертификатов
Git
Ошибка
fatal: unable to access 'https://...': SSL certificate problem: unable to get local issuer certificate
Исправление 1: Обновите сертификаты удостоверяющих центров (то же, что и для curl)
sudo apt update && sudo apt install ca-certificates
Исправление 2: Укажите Git правильный набор сертификатов
git config --global http.sslCAInfo /etc/ssl/certs/ca-certificates.crt
Исправление 3: В Windows (Git for Windows)
Git for Windows включает собственный набор сертификатов удостоверяющих центров. Обновите Git до последней версии или:
git config --global http.sslBackend schannel
Это указывает Git использовать встроенное хранилище сертификатов Windows вместо собственного.
Не делайте так в продакшене
git config --global http.sslVerify false # Отключает ВСЮ проверку SSL для Git
Python (requests / pip)
Ошибка (requests)
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED]
Ошибка (pip)
pip install ... Could not fetch URL https://...: connection error: [SSL: CERTIFICATE_VERIFY_FAILED]
Исправление 1: Обновите certifi (набор сертификатов Python)
pip install --upgrade certifi
Библиотека requests в Python использует пакет certifi для сертификатов удостоверяющих центров, а не системное хранилище.
Исправление 2: Укажите системный набор сертификатов
import requests
response = requests.get('https://example.com', verify='/etc/ssl/certs/ca-certificates.crt')
Или через переменную окружения:
export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
Исправление 3: macOS Python (частая проблема)
В macOS Python часто имеет пустое хранилище сертификатов после установки. Выполните:
# Найдите вашу установку Python
python3 -c "import ssl; print(ssl.get_default_verify_paths())"
# Установите сертификаты (macOS Python с python.org)
/Applications/Python\ 3.x/Install\ Certificates.command
Исправление для pip
pip install --upgrade pip
pip config set global.cert /etc/ssl/certs/ca-certificates.crt
Node.js
Ошибка
Error: unable to get local issuer certificate
code: 'UNABLE_TO_GET_ISSUER_CERT_LOCALLY'
Исправление 1: Установите NODE_EXTRA_CA_CERTS
export NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt
Это добавляет дополнительные удостоверяющие центры без замены встроенного набора Node.
Исправление 2: Для самоподписанных сертификатов в разработке
// Только для разработки — добавляет конкретный удостоверяющий центр
const https = require('https');
const fs = require('fs');
const agent = new https.Agent({
ca: fs.readFileSync('/path/to/custom-ca.pem'),
});
fetch('https://internal-service.local', { agent });
Не делайте так в продакшене
export NODE_TLS_REJECT_UNAUTHORIZED=0 # Отключает ВСЮ проверку SSL
Корпоративный прокси / корпоративные среды
Многие корпоративные сети используют TLS-инспекцию через прокси, который переподписывает трафик с помощью внутреннего удостоверяющего центра. Ваши инструменты не доверяют этому внутреннему удостоверяющему центру.
Исправление: Получите сертификат корпоративного удостоверяющего центра от IT-отдела и добавьте его:
# На уровне системы (Debian/Ubuntu)
sudo cp corporate-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
# Python
export REQUESTS_CA_BUNDLE=/path/to/corporate-ca-bundle.pem
# Node.js
export NODE_EXTRA_CA_CERTS=/path/to/corporate-ca.pem
# Git
git config --global http.sslCAInfo /path/to/corporate-ca-bundle.pem
Docker-контейнеры
Docker-образы часто содержат устаревшие наборы сертификатов. Исправление:
# На базе Debian
RUN apt-get update && apt-get install -y ca-certificates && update-ca-certificates
# Alpine
RUN apk add --no-cache ca-certificates
Быстрая диагностика
# Проверьте, работает ли SSL-соединение через openssl
openssl s_client -connect example.com:443 -servername example.com < /dev/null 2>/dev/null | grep "Verify return code"
# "0 (ok)" = цепочка в порядке, проблема в наборе сертификатов вашего инструмента
# "21 (unable to verify)" = цепочка на сервере неполная
# Проверьте, какой набор сертификатов использует ваша система
python3 -c "import certifi; print(certifi.where())"
curl-config --ca 2>/dev/null || echo "Check /etc/ssl/certs/"
Часто задаваемые вопросы
Почему это работает в браузере, но не в curl/Python?
Браузеры поддерживают собственное хранилище удостоверяющих центров (обновляемое вместе с браузером). Инструменты командной строки используют системный набор сертификатов или свой собственный (Python использует certifi, Git for Windows включает свой). Если системный набор устарел, инструменты командной строки выдают ошибку, а браузеры работают нормально.
Безопасно ли отключать проверку SSL?
Для быстрого тестирования — да, если вы понимаете, что не проверяете подлинность сервера. Для продакшен-кода или CI/CD — никогда. Отключение проверки открывает вас для атак типа «человек посередине». Всегда устраняйте основную причину (обновите набор сертификатов или исправьте цепочку на сервере).
Сертификат сервера в порядке, но ошибки всё равно появляются
Проверьте, не проходит ли ваш инструмент через прокси, который переподписывает трафик. Корпоративные сети, некоторые VPN и антивирусное ПО делают это. Удостоверяющий центр прокси не находится в хранилище доверия вашего инструмента.