Как подключить GigaChat к n8n в Docker без отключения TLS

При подключении GigaChat API к self-hosted n8n в Docker возникает ошибка SSL-верификации: Node.js не доверяет сертификатам Минцифры. Решение — добавить корневой сертификат через NODE_EXTRA_CA_CERTS, а не отключать проверку.

Главное
  • Node.js использует корневые сертификаты NSS от Mozilla, куда не входит удостоверяющий центр Минцифры России
  • Отключение проверки через NODE_TLS_REJECT_UNAUTHORIZED=0 действует на весь процесс и открывает путь для MITM-атак
  • Правильный способ — прокинуть сертификат Минцифры в контейнер и указать переменную NODE_EXTRA_CA_CERTS
Схема подключения GigaChat API к n8n в Docker с настройкой сертификатов Минцифры
Фото: Хабр: ИИ

При деплое self-hosted n8n в Docker и попытке подключить GigaChat API разработчики сталкиваются с ошибкой UNABLE_TO_VERIFY_LEAF_SIGNATURE. Проблема в том, что рантайм Node.js доверяет корневым сертификатам NSS от Mozilla Foundation, а удостоверяющий центр Минцифры России в этот список не входит.

Почему возникает ошибка

Сертификаты для доменов Сбера подписывает Головной удостоверяющий центр Минцифры. При TLS-хендшейке Node.js не находит корневой сертификат в своём хранилище и разрывает соединение. Типичная ошибка выглядит так:

Error: unable to verify the first certificate
code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'

Чем опасно отключение TLS

Популярный совет с форумов — выставить NODE_TLS_REJECT_UNAUTHORIZED=0 в docker-compose. Это отключает проверку сертификатов глобально для всего процесса Node.js: не только для GigaChat, но и для обращений к базам данных, вебхукам и Telegram Bot API. При компрометации маршрутизации злоумышленник может провести MITM-атаку и перехватить Bearer-токены.

Правильная настройка сертификатов

Нужно научить Node.js распознавать подпись Минцифры. На сервере собирается бандл из корневого и промежуточного сертификатов:

  • Скачать russian_trusted_root_ca.cer и russian_trusted_sub_ca.cer с gu-st.ru
  • Объединить их в один файл /opt/certs/russian_trusted_root_ca.crt
  • Прокинуть файл в контейнер через volume
  • Указать переменную NODE_EXTRA_CA_CERTS=/home/node/certs/russian_trusted_root_ca.crt

После рестарта контейнера проверять соединение нужно внутри контейнера, а не через openssl s_client — утилита не увидит переменную Node.js. Ответ 200 или 403 означает, что TLS работает.

Особенности n8n 1.x

В n8n 1.x прямой доступ к переменным окружения из нод заблокирован: попытка использовать $env.GIGACHAT_TOKEN выдаёт ExpressionError: access to env vars denied. Вместо снятия блокировки через N8N_BLOCK_ENV_ACCESS_IN_NODE=false рекомендуется завести ключ через Header Auth в Credentials.

Синдром Ивана

Отдельная история — галлюцинация GigaChat при обработке PII. Модель должна была извлекать имя клиента в поле first_name, но при отсутствии имени в сообщении подставляла самое частое русское имя из датасета — Иван. Бот начал приветствовать всех пользователей фразой «Здравствуйте, Иван». Проблему решили переписыванием промпта с запретом на домысливание и добавлением проверки имени в ноде Code.

Исходники docker-compose и готовый воркфлоу выложены в открытом репозитории n8n-gigachat-starter-kit.

Для профиТехнические детали: архитектура, цифры, ссылки

Стек: n8n в Docker, PostgreSQL в Docker, GigaChat API (Сбер) для обработки русскоязычных сообщений с учётом 152-ФЗ, Gemini Flash для скоринга. GigaChat выбран из-за размещения серверов в РФ.

Эндпоинт: https://gigachat.devices.sberbank.ru/api/v1/chat/completions

Сборка бандла сертификатов:

mkdir -p /opt/certs
curl -k -s https://gu-st.ru/content/Other/doc/russian_trusted_root_ca.cer > /opt/certs/russian_trusted_root_ca.crt
echo "" >> /opt/certs/russian_trusted_root_ca.crt
curl -k -s https://gu-st.ru/content/Other/doc/russian_trusted_sub_ca.cer >> /opt/certs/russian_trusted_root_ca.crt
chmod 644 /opt/certs/russian_trusted_root_ca.crt

Проверка TLS внутри контейнера:

docker exec -it n8n node -e "require('https').get('https://gigachat.devices.sberbank.ru', (res) => console.log('TLS code:', res.statusCode)).on('error', console.error)"

Репозиторий: n8n-gigachat-starter-kit

Что это значит для России

GigaChat API от Сбера работает на серверах в России, что позволяет обрабатывать персональные данные в соответствии с 152-ФЗ. Для self-hosted решений на Node.js требуется ручная установка корневых сертификатов Минцифры — это стандартная процедура для интеграции российских сервисов.

Вопросы и ответы

Почему n8n не подключается к GigaChat API?
Node.js не доверяет сертификатам Минцифры, так как использует корневые сертификаты NSS от Mozilla. Возникает ошибка UNABLE_TO_VERIFY_LEAF_SIGNATURE.
Можно ли отключить проверку сертификатов?
Технически можно через NODE_TLS_REJECT_UNAUTHORIZED=0, но это отключает проверку для всего процесса Node.js и открывает путь для MITM-атак.
Как правильно добавить сертификаты Минцифры?
Скачать корневой и промежуточный сертификаты с gu-st.ru, объединить в один файл, прокинуть в контейнер через volume и указать переменную NODE_EXTRA_CA_CERTS.