Skip to main content

Установка TLS-сертификата Минцифры

Текущие TLS-сертификаты T-API могут быть отозваны — в таком случае T-API будет переведен на сертификат Минцифры. Если не выполнить настройку заранее, в момент переключения сертификатов запросы к API будут возвращать ошибку проверки TLS-сертификата (certificate verify failed, unable to get local issuer certificate, PKIX path building failed), и интеграция перестанет работать.

Зачем это нужно

CA/Browser Forum — международная организация, в которую входят крупнейшие центры сертификации и компании, разрабатывающие браузеры, например Google, Apple, Microsoft, Mozilla. CA/Browser Forum ужесточила правила проверки организаций — сертификаты GlobalSign, которые банк использует сейчас, пока действительны, но могут быть отозваны.

Когда это произойдет, банк перейдет на сертификаты Национального удостоверяющего центра Минцифры России (Russian Trusted CA). Рекомендуем выполнить настройку заранее, чтобы переключение прошло для вас незаметно.

Сертификаты Минцифры не входят в доверенные хранилища большинства операционных систем, языковых рантаймов и HTTP-библиотек по умолчанию. Поскольку ваш код обращается к API программно, а не через браузер, добавьте сертификаты в trust store серверного окружения, из которого выполняются запросы.

Вам нужно установить два сертификата:

  • Russian Trusted Root CA — корневой;
  • Russian Trusted Sub CA — промежуточный.

Шаг 1. Скачайте сертификаты

Скачайте сертификаты с портала Госуслуг](https://www.gosuslugi.ru/crt). На странице перейдите в раздел для вашей операционной системы и скачайте два файла:

  1. russian_trusted_root_ca.cer — корневой сертификат;
  2. russian_trusted_sub_ca.cer — промежуточный сертификат.

Проверьте формат файла сертификата. Файлы .cer бывают двух форматов:

  • текстового — PEM, который начинается с -----BEGIN CERTIFICATE-----;
  • бинарного — DER.

Утилиты update-ca-certificates и keytool принимают только PEM.

DER-файл нужно сконвертировать в PEM:

# Проверить формат
openssl x509 -in cert.cer -noout -text >/dev/null 2>&1 && echo "PEM" || echo "DER (нужна конвертация)"

# Конвертировать DER в PEM
openssl x509 -inform DER -in cert.cer -out cert.pem

Шаг 2. Установите сертификаты

Установите сертификаты для вашего окружения. Если окружений несколько — например, JVM-приложение в Docker, выполните настройку для каждого из них.

Linux (Debian / Ubuntu)

sudo cp russian_trusted_root_ca.pem /usr/local/share/ca-certificates/russian_trusted_root_ca.crt
sudo cp russian_trusted_sub_ca.pem /usr/local/share/ca-certificates/russian_trusted_sub_ca.crt
sudo update-ca-certificates

Linux (RHEL / CentOS / Alma / Rocky)

sudo cp russian_trusted_*.pem /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

Java / JVM

JVM не использует системное хранилище ОС. Рекомендуем создать отдельный truststore, а не изменять cacerts внутри JRE. Изменения в cacerts сбрасываются при обновлении JDK, а в prod-среде на запись в этот файл часто нет прав.

# Создать отдельный truststore и импортировать оба сертификата
keytool -importcert -alias russian_trusted_root \
-file russian_trusted_root_ca.pem \
-keystore russian_truststore.jks \
-storepass <пароль> -noprompt

keytool -importcert -alias russian_trusted_sub \
-file russian_trusted_sub_ca.pem \
-keystore russian_truststore.jks \
-storepass <пароль> -noprompt

Укажите truststore при запуске приложения:

java -Djavax.net.ssl.trustStore=/path/to/russian_truststore.jks \
-Djavax.net.ssl.trustStorePassword=<пароль> \
-jar app.jar

Отдельный truststore не наследует системные доверенные CA — он содержит только явно добавленные сертификаты. Если приложению нужно доверять одновременно публичным CA и сертификатам Минцифры, импортируйте сертификаты Минцифры в копию стандартного cacerts и используйте ее или добавьте все необходимые корневые сертификаты в truststore.

Путь к стандартному хранилищу зависит от версии JDK: Java 8 — $JAVA_HOME/jre/lib/security/cacerts, Java 9+ — $JAVA_HOME/lib/security/cacerts.

Python (requests / httpx / aiohttp)

Эти библиотеки используют bundle certifi, а не системное хранилище. Доступны два варианта:

# Через переменные окружения (действуют на весь процесс)
export REQUESTS_CA_BUNDLE=/path/to/russian-trusted-ca-bundle.pem
export SSL_CERT_FILE=/path/to/russian-trusted-ca-bundle.pem
# Или явно в коде
import requests
requests.get("https://mddc.tbank.ru/", verify="/path/to/russian-trusted-ca-bundle.pem")

Node.js

Node.js по умолчанию игнорирует системное хранилище:

NODE_EXTRA_CA_CERTS=/path/to/russian-trusted-ca-bundle.pem node app.js

Docker

Добавляйте сертификаты на этапе сборки образа, а не в рантайме:

COPY russian-trusted-ca-bundle.pem /usr/local/share/ca-certificates/russian-trusted-ca.crt
RUN update-ca-certificates

# Для Node.js и Python внутри контейнера задайте переменные окружения:
ENV NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt
ENV REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt

Windows / .NET / IIS

.NET использует системное хранилище сертификатов Windows. Для установки в хранилище LocalMachine, которое используется сервисами и приложениями, работающими не от имени текущего пользователя, выполните команды:

# PowerShell с правами администратора
Import-Certificate -FilePath "C:\certs\russian_trusted_root_ca.cer" `
-CertStoreLocation Cert:\LocalMachine\Root

Import-Certificate -FilePath "C:\certs\russian_trusted_sub_ca.cer" `
-CertStoreLocation Cert:\LocalMachine\CA

Корневой сертификат устанавливается в хранилище Root (доверенные корневые CA), промежуточный — в CA (промежуточные CA). То же самое можно сделать через GUI в certlm.msc. После установки перезапустите пул приложений или сервис.

Шаг 3. Проверьте установку

curl -v https://mddc.tbank.ru/
# Ожидаемый результат: SSL certificate verify ok
openssl s_client -connect mddc.tbank.ru:443 -servername mddc.tbank.ru -showcerts </dev/null
# Флаг -servername (SNI) обязателен: без него на shared-хостинге может вернуться не тот сертификат.
# В цепочке должны присутствовать Russian Trusted Root CA и Russian Trusted Sub CA.
# Проверить срок действия установленного сертификата
echo | openssl s_client -connect mddc.tbank.ru:443 -servername mddc.tbank.ru 2>/dev/null \
| openssl x509 -noout -dates

Если в выводе команд сейчас отображается сертификат GlobalSign — переключения еще не было, и банк использует действующий сертификат. Цепочка сменится автоматически в момент перехода. Убедитесь, что в выводе есть SSL certificate verify ok и сертификаты Минцифры уже установлены в вашем окружении.

После установки сертификатов пересоберите и перезапустите сервисы в контейнерах, чтобы изменения вступили в силу.

Возможные проблемы

ПроблемаПричинаРешение
unable to get local issuer certificateНе установлен промежуточный сертификат (Sub CA)Установить оба сертификата
Ошибка сохраняется после update-ca-certificatesPython/Node.js используют собственный bundleЗадать переменные REQUESTS_CA_BUNDLE / NODE_EXTRA_CA_CERTS
В Docker всё падает в рантаймеСертификат добавлен после сборкиДобавить сертификат на этапе build и пересобрать образ
Работает локально, падает в productionРазные окружения или разные truststoreВыполнить настройку в каждом окружении
update-ca-certificates отработал, но CA не доверяетсяФайл в формате DER вместо PEMСконвертировать: openssl x509 -inform DER -in cert.cer -out cert.pem
Соединение отклонено при корректно установленном CAВключён certificate pinningОбновить pin на новый сертификат
При проверке возвращается не тот сертификатНе передан SNIДобавить флаг -servername <домен> в команду openssl s_client
При проверке возвращается сертификат GlobalSign / другой УЦПереключение ещё не произошлоЭто нормально — сейчас используется действующий сертификат GlobalSign. Цепочка сменится автоматически в момент переключения. Убедитесь, что сертификаты Минцифры уже установлены

Откатить изменения

Если после установки возникли проблемы, удалите добавленные сертификаты:

# Debian / Ubuntu
sudo rm /usr/local/share/ca-certificates/russian_trusted_*.crt && sudo update-ca-certificates --fresh

# RHEL / CentOS
sudo rm /etc/pki/ca-trust/source/anchors/russian_trusted_*.pem && sudo update-ca-trust

# Java — уберите флаги -Djavax.net.ssl.trustStore и -Djavax.net.ssl.trustStorePassword при запуске

# Windows
# Remove-Item Cert:\LocalMachine\Root\<thumbprint>

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

Общие вопросы

Подготовка

Технические вопросы

Проверка

openapi@tbank.ru

АО «ТБанк» использует файлы «cookie» с целью персонализации сервисов и повышения удобства пользования веб-сайтом. «Cookie» представляют собой небольшие файлы, содержащие информацию о предыдущих посещениях веб-сайта. Если вы не хотите использовать файлы «cookie», измените настройки браузера.