Обновить

API Т‑Банка и сертификаты Минцифры: как использовать без установки на сервере

У меня есть Tg-бот, в нём я подключил оплату через платёжные ссылки Т-Банка. В какой-то момент ссылки перестали создаваться, в логах ошибка:
SSL certificate OpenSSL verify result: self-signed certificate in certificate chain (19)

Причина: Т и другие российские банки стали переходить на отечественные сертификаты, ибо зарубежные удостоверяющие центры стали отзывать свои сертификаты.

Варианты действий:

  1. Подключить другую платёжку, которая (пока) не импортозаместила сертификаты.

  2. Установить сертификаты на сервер (инструкция).
    Вам потребуется определённая степень доверия родному государству.
    На виртуальном хостинге так и вовсе может быть невозможно.

  3. Собрать свою цепочку из сертификатов и использовать её только при запросах к API российских банков.
    Подходит для виртуального хостинга.

Третьему варианту меня научила нейронка, вот порядок действий:

  1. Скачать сертификаты.

  2. Распаковать два архива и загрузить на сервер вот эти файлы:
    russian_trusted_root_ca_pem.crt
    russian_trusted_sub_ca_pem.crt
    russian_trusted_sub_ca_2024_pem.crt

  3. На сервере (у меня Ubuntu) скачать набор сертификатов от Mozilla:

    curl -fsSL -o cacert.pem https://curl.se/ca/cacert.pem
  4. Собрать объединённую цепочку:

    cat \
       cacert.pem \
       russian_trusted_root_ca_pem.crt \
       russian_trusted_sub_ca_pem.crt \
       russian_trusted_sub_ca_2024_pem.crt \
       > ru-ca-bundle.pem
  5. Проверить, что работает:

    curl -v --cacert ru-ca-bundle.pem https://mddc.tbank.ru/
  6. Посмотреть сроки действия сертификатов:

    openssl x509 -in russian_trusted_root_ca_pem.crt -noout -subject -issuer -dates
    openssl x509 -in russian_trusted_sub_ca_pem.crt -noout -subject -issuer -dates
    openssl x509 -in russian_trusted_sub_ca_2024_pem.crt -noout -subject -issuer -dates
  7. Выбрать минимальную из дат и поставить себе напоминалку, чтобы обновить их.

  8. Добавить использование этой цепочки в коде запросов к российским банкам.
    У меня на php это выглядит так:

    $caBundlePath = __DIR__ . '/ru-ca-bundle.pem';
    if (!is_readable($caBundlePath)) {
        myerror("Tinkoff CA bundle is not readable", ['path' => $caBundlePath]);
        return false;
    }
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => TINKOFF_INIT_URL,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => $postDataJson,
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/json',
            'Content-Length: ' . strlen($postDataJson),
        ],
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_SSL_VERIFYHOST => 2,
        CURLOPT_CAINFO => $caBundlePath,
    ]);
    
    $output = curl_exec($ch);

Таким образом, запросы к банку будут отправляться с использованием российских сертификатов, а все остальные — как и раньше, с использованием глобальных.

Теги:
+9
Комментарии2
ЕЖЕДНЕВНЫЙ ХАБР | 11 АВГ 2026
Охват82K

Мидл — это не три года опыта. Грейды в DevOps как типы ответственности

Два инженера, у обоих пять лет в DevOps и одинаковый стек в резюме: Kubernetes, Terraform, GitLab и вот это вот всё. Весной оба ходили по собеседованиям, но первый собрал офферы уровня “мидл, 200”, второй ушёл с “сеньор, 300” (алгоритмические секции первый, к слову, проходил лучше). Разница больше миллиона в год при неотличимых резюме. Ниже рамка, которая по моему мнению объясняет за что доплачивают, и три вопроса, чтобы найти в ней себя.

Мидл — это не три года опыта. Грейды в DevOps как типы ответственности

Публикации