Все руководства по развёртыванию Развёртывание

Исправление ошибок SSL-сертификатов в curl, Git, Python и Node.js

Ошибка 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 и антивирусное ПО делают это. Удостоверяющий центр прокси не находится в хранилище доверия вашего инструмента.

Похожие статьи

SSL и сертификаты 2026-05-07
Цепочка доверия сертификатов: подробное объяснение
Как браузеры проверяют SSL-сертификаты через цепочку от корневого CA к промежуточному CA и до вашего сертификата. Узнайте, почему важен порядок цепочки и как исправить ошибку 'сертификат не является доверенным'.
SSL и сертификаты 2026-05-08
Самоподписанные vs CA-подписанные SSL-сертификаты
Самоподписанные сертификаты вызывают предупреждения браузера. CA-подписанные сертификаты автоматически доверены. Узнайте, когда какой подходит, как создать оба и почему бесплатные CA-сертификаты делают самоподписанные устаревшими для продакшена.
Развёртывание 2026-05-08
HTTPS для Localhost: SSL-сертификаты для локальной разработки
Настройте доверенный HTTPS на localhost с помощью mkcert — без предупреждений браузера. Описывает настройку mkcert, самоподписанные сертификаты и почему Let's Encrypt не может выдать сертификат для localhost.
SSL и сертификаты 2026-05-08
Шпаргалка по командам OpenSSL для SSL-сертификатов
Краткий справочник по самым распространённым командам OpenSSL: проверка срока действия сертификата, верификация цепочек, генерация ключей, конвертация форматов и отладка TLS-соединений.
Получите бесплатный SSL-сертификат в браузере
Без установки, без аккаунта. Ваш приватный ключ никогда не покидает устройство.
Получить сертификат