<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[SSL&#x2F;TLS unable to get local issuer certificate: решение]]></title><description><![CDATA[<p dir="auto">Ошибка “unable to get local issuer certificate” — одна из самых частых проблем при работе с HTTPS и защищёнными соединениями. Встречается она в Python, Node.js, cURL, Git и множестве других инструментов. Суть проблемы в том, что система не может проверить цепочку сертификатов сервера, потому что не находит доверенный корневой сертификат.</p>
<p dir="auto">Эта ошибка особенно раздражает при работе с корпоративными прокси, самоподписанными сертификатами или устаревшими системами. Знание того, как её решить, сэкономит вам часы отладки и поможет правильно настроить безопасное соединение без компромиссов безопасности.</p>
<h2>Почему вообще происходит эта ошибка</h2>
<p dir="auto">Когда приложение пытается подключиться к серверу через HTTPS, оно проверяет SSL/TLS сертификат сервера. Проверка — это не просто просмотр самого сертификата, а полная валидация цепочки доверия. Сертификат сервера обычно подписан промежуточным центром сертификации (intermediate CA), а тот, в свою очередь, подписан корневым центром (root CA).</p>
<p dir="auto">Ошибка возникает, когда локальное хранилище сертификатов вашей системы не содержит необходимого корневого или промежуточного сертификата из этой цепочки. Это может происходить по нескольким причинам:</p>
<ul>
<li><strong>Устаревшее хранилище CA сертификатов</strong> — система давно не обновляла список доверенных центров, и новые корневые сертификаты просто не установлены</li>
<li><strong>Неправильный путь к CA bundle</strong> — приложение смотрит в неправильное место и не находит файл с сертификатами</li>
<li><strong>Корпоративный прокси или firewall</strong> — они блокируют или модифицируют SSL-соединение, требуя дополнительных сертификатов</li>
<li><strong>Самоподписанные сертификаты</strong> — в разработке часто используются сертификаты, которые никто не подписывал, и система их попросту не знает</li>
<li><strong>Неполная цепочка на сервере</strong> — сервер отправляет только сертификат, но не промежуточные сертификаты</li>
</ul>
<h2>Как исправить в разных языках и инструментах</h2>
<p dir="auto">Способ решения зависит от того, где именно вы столкнулись с ошибкой. Давайте разберём самые частые случаи.</p>
<h3>Python и requests</h3>
<p dir="auto">Если вы используете библиотеку requests для HTTP запросов в Python, проблема обычно в том, что версия пакета certifi (который хранит список доверенных сертификатов) устаревшая. Первое, что нужно сделать — обновить его:</p>
<pre><code class="language-bash">pip install --upgrade certifi
</code></pre>
<p dir="auto">Это часто решает проблему, потому что certifi регулярно обновляется с новыми корневыми сертификатами. Если обновление не помогло, можно явно указать путь к CA bundle:</p>
<pre><code class="language-python">import ssl
import certifi

ssl_context = ssl.create_default_context(cafile=certifi.where())
</code></pre>
<p dir="auto">Если у вас корпоративный сертификат, сохраните его в файл и используйте так:</p>
<pre><code class="language-python">import requests

response = requests.get(
    'https://your-domain.com',
    verify='/path/to/your-ca-bundle.pem'
)
</code></pre>
<h3>Node.js</h3>
<p dir="auto">В Node.js ситуация похожа, но настраивается через переменную окружения. Установите переменную NODE_EXTRA_CA_CERTS, указав путь к вашему сертификату:</p>
<pre><code class="language-bash">export NODE_EXTRA_CA_CERTS="/path/to/your-ca-bundle.pem"
node your-app.js
</code></pre>
<p dir="auto">Она работает для всех Node.js приложений, запущенных в этой сессии терминала. Если нужно постоянно, добавьте это в .bashrc или .zshrc.</p>
<p dir="auto">Для Azure DevOps или CI/CD пайплайнов переменная указывается в конфиге:</p>
<pre><code class="language-yaml">variables:
  NODE_EXTRA_CA_CERTS: $(Build.SourcesDirectory)/certs/my-root-ca.pem
</code></pre>
<h3>cURL</h3>
<p dir="auto">cURL — это утилита, которая часто используется в скриптах и вебхуках. Если вы получаете ошибку при запросе, сначала обновите пакет ca-certificates:</p>
<pre><code class="language-bash"># Для Debian/Ubuntu
sudo apt-get update
sudo apt-get install ca-certificates

# Для macOS
brew update
brew install curl-ca-bundle
</code></pre>
<p dir="auto">Если это не поможет, укажите сертификат напрямую в команде:</p>
<pre><code class="language-bash">curl --cacert /path/to/custom-ca.pem https://your-domain.com
</code></pre>
<p dir="auto">Или укажите директорию с сертификатами:</p>
<pre><code class="language-bash">curl --capath /etc/ssl/certs https://your-domain.com
</code></pre>
<h3>Git</h3>
<p dir="auto">Git часто ругается на самоподписанные или внутренние сертификаты. Есть несколько подходов:</p>
<p dir="auto">Обновить корневые сертификаты в системе. На Linux:</p>
<pre><code class="language-bash">sudo update-ca-certificates
</code></pre>
<p dir="auto">Если нужно быстро, но небезопасно, отключить проверку (только для разработки!):</p>
<pre><code class="language-bash">git config --global http.sslVerify false
</code></pre>
<p dir="auto">Боле правильный способ — добавить корпоративный сертификат в конфиг Git:</p>
<pre><code class="language-bash">git config --global http.sslCAInfo /path/to/your-ca-bundle.pem
</code></pre>
<h3>Postman</h3>
<p dir="auto">В Postman удобнее всего работать с настройками. Если у вас корпоративный сертификат:</p>
<ol>
<li>Откройте Settings → Certificates → CA Certificates</li>
<li>Загрузите ваш CA bundle (полный сертификат с цепочкой)</li>
<li>Перезагрузите Postman</li>
<li>Включите проверку сертификатов в Settings → General → SSL certificate verification</li>
</ol>
<p dir="auto">Можно также отключить проверку в Settings → General, но это небезопасно для продакшена.</p>
<h2>Таблица решений по ситуациям</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Ситуация</th>
<th>Решение</th>
<th>Риск</th>
</tr>
</thead>
<tbody>
<tr>
<td>Устаревшие CA сертификаты</td>
<td>Обновить certifi, ca-certificates, curl</td>
<td>Минимальный</td>
</tr>
<tr>
<td>Корпоративный прокси</td>
<td>Загрузить корневой и промежуточный сертификаты компании</td>
<td>Минимальный</td>
</tr>
<tr>
<td>Самоподписанный сертификат в разработке</td>
<td>Добавить сертификат в trusted store или отключить проверку</td>
<td>Высокий если в продакшене</td>
</tr>
<tr>
<td>Неполная цепочка на сервере</td>
<td>Настроить сервер на отправку полной цепочки</td>
<td>Нулевой</td>
</tr>
<tr>
<td>Старая версия OpenSSL</td>
<td>Обновить OpenSSL и системные библиотеки</td>
<td>Минимальный</td>
</tr>
</tbody>
</table>
<h2>Когда отключение проверки — это нормально</h2>
<p dir="auto">Это важный момент, потому что в интернете часто советуют просто отключить проверку сертификатов. Это работает, но… <strong>никогда не делайте это в продакшене</strong>. Это открывает двери для man-in-the-middle атак.</p>
<p dir="auto">Отключение проверки допустимо только в очень специфических ситуациях:</p>
<ul>
<li>Локальная разработка с самоподписанными сертификатами</li>
<li>Тестирование в контролируемой среде (вроде CI/CD для тестов)</li>
<li>Временная отладка, когда вы точно знаете, что соединение безопасно</li>
</ul>
<p dir="auto">Если вы в корпоративной сети и сталкиваетесь с этой ошибкой постоянно, это признак того, что нужно <strong>правильно</strong> добавить корпоративные сертификаты, а не отключать проверку.</p>
<h2>Практические советы, которые работают</h2>
<p dir="auto">Сначала всегда пытайтесь самый простой путь — обновление системных сертификатов. Это решает большинство проблем:</p>
<pre><code class="language-bash"># macOS
brew install curl-ca-bundle

# Ubuntu/Debian
sudo apt-get install ca-certificates
sudo update-ca-certificates

# Windows (PowerShell)
certutil -generateSSTFromWU roots.sst
</code></pre>
<p dir="auto">Если это не помогло, найдите, где именно хранятся сертификаты в вашей системе. Для разных ОС это разные места:</p>
<ul>
<li><strong>macOS</strong>: /usr/local/etc/openssl/cert.pem или через certifi.where() в Python</li>
<li><strong>Linux</strong>: /etc/ssl/certs/ca-certificates.crt или /etc/ssl/certs/</li>
<li><strong>Windows</strong>: Хранилище сертификатов системы (можно открыть через certlm.msc)</li>
</ul>
<p dir="auto">Проверьте, что ваше приложение смотрит в правильное место. Например, в Python:</p>
<pre><code class="language-python">import certifi
print(certifi.where())
</code></pre>
<p dir="auto">Это покажет точный путь к CA bundle, который использует Python.</p>
<p dir="auto">Если у вас есть корпоративный сертификат, убедитесь, что вы загружаете <strong>полную цепочку</strong> (root + intermediate + leaf), а не только один сертификат. Часто проблема именно в этом — забывают про промежуточный уровень.</p>
<h2>На что стоит обратить внимание дальше</h2>
<p dir="auto">Эта ошибка часто указывает на более глубокие проблемы в настройке инфраструктуры. Если вы постоянно сталкиваетесь с ней, имеет смысл провести аудит SSL/TLS конфигурации на ваших серверах и в клиентских приложениях. Проверьте, что сервер правильно отправляет полную цепочку сертификатов, что все промежуточные CA включены, и что версии OpenSSL актуальны. Для глубокого анализа можно использовать онлайн-сервисы вроде SSL Labs. Также подумайте о том, имеет ли смысл вообще использовать самоподписанные сертификаты в разработке — может быть, проще настроить Let’s Encrypt для локальной сети или использовать инструменты вроде mkcert для генерации доверенных сертификатов на лету.</p>
]]></description><link>https://forum.exlends.ru/topic/547/ssl-tls-unable-to-get-local-issuer-certificate-reshenie</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 04:32:30 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/547.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 Feb 2026 12:06:09 GMT</pubDate><ttl>60</ttl></channel></rss>