TAŇBA-OOH Разработчикам

Форматы конверта согласования и списка отзыва

Два подписанных файла решают, что плеер вправе показывать: конверт согласования, который идет с каждым медиафайлом, и список отзыва, который отзывает согласование. Эта страница описывает оба, чтобы плеер, CMS или программа проверки могли прочитать их без нашего программного обеспечения.

Страницы справочника: Форматы конверта согласования и списка отзыва и Протокол устройства.

Пакет согласования

Согласованный ролик доставляется двумя файлами с опубликованным именованием: медиафайл и его конверт, например spot.mp4 и spot.mp4.p7s. Конверт согласования можно скачать через API интеграции (GET /api/v1/approvals/{number}/envelope, право read:approvals). Конверт без файла, который он называет, бесполезен, а файлу без конверта на экране быть нельзя.

Конверт

Конверт это один CMS SignedData в формате DER (файл .p7s). Подписанное содержимое это манифест согласования в каноническом JSON (RFC 8785), который называет медиафайл по его SHA-256.

Боевое согласование несет две подписи (тестовый контур может выпускать и конверты с одной подписью, о чем сказано в примечании манифеста):

В манифесте есть версия v, среда env (test или prod), номер согласования, идентификаторы согласования и органа, рекламодатель, медиа (sha256, size, duration_ms, width, height), срок действия (valid_from, valid_until), конструкции, которые покрывает согласование, регламент (code, version) и issued_at. Публичная страница /v1/approval/{number} показывает тот же манифест с замаскированным номером рекламодателя и manifest_sha256, хэш исходных байтов.

Подписанные атрибуты и назначения ключей

Подпись платформы несет эти подписанные атрибуты, а сертификаты несут эти расширенные назначения ключа. Все идентификаторы лежат в дуге 1.3.6.1.4.1.59999.1.

ИдентификаторДля чего
1.3.6.1.4.1.59999.1.1Подписанный атрибут: регистрационный номер медиа
1.3.6.1.4.1.59999.1.2Подписанный атрибут: идентификатор согласующего органа
1.3.6.1.4.1.59999.1.3Подписанный атрибут: срок окончания согласования
1.3.6.1.4.1.59999.1.4Подписанный атрибут: SHA-256 значения государственной подписи
1.3.6.1.4.1.59999.1.5Подписанный атрибут: среда, test или prod
1.3.6.1.4.1.59999.1.6Расширенное назначение ключа сертификата согласований
1.3.6.1.4.1.59999.1.7Расширенное назначение ключа сертификата статуса: списки отзыва, якоря аудита, печати статистики
1.3.6.1.4.1.59999.1.8Расширенное назначение ключа сертификата команд устройствам

Эта дуга временная: это частная тестовая дуга. Зарегистрированная дуга заменит ее до того, как прошивке будет велено доверять конверту в бою, а протокол устройства остается в статусе «бета» до этого. Не вшивайте эти числа во все, что должно пережить тестовый контур.

Что решает плеер

Плеер проверяет файл до показа и сообщает об отказе ровно одним кодом:

КодЗначение
NO_SIGNATUREКонверта нет
BAD_SIGNATUREНеверны подпись, цепочка сертификатов или назначение ключа
HASH_MISMATCHФайл не тот, который называет манифест
EXPIRED_APPROVALВне срока согласования, до него или после
REVOKEDСогласование есть в действующем списке отзыва

Государственную подпись платформа проверяет при выпуске согласования. Плеер, который не умеет читать ключи GOST, принимает решение по подписи платформы и сообщает, что государственная подпись есть, но не проверена (OUTER_NOT_VERIFIED в tanba-verify). Обычные программы вроде OpenSSL тоже не читают ключ GOST, поэтому пользуйтесь tanba-verify со страницы Загрузки или проверками своего плеера.

Список отзыва

Список отзыва это CMS SignedData со вложенным списком, подписанный ключом статуса платформы. У ключа назначение статуса, поэтому сертификат согласований не может выпустить список. Новейший список берется с https://verify.tanba-ooh.kz/v1/revocations/latest (с ?format=json тело и подпись приходят в JSON), список заданной версии с https://devices.tanba-ooh.kz/d/v1/revocations/{version}. Вызовы открытые и кэшируются на 60 секунд.

Тело это канонический JSON:

{"v": 1, "env": "prod", "version": 42, "issued_at": "2026-10-14T08:00:00Z", "not_after": "2026-10-15T08:00:00Z",
 "revoked": [{"approval_number": "TNB-2026-000123", "revoked_at": "2026-10-14T07:30:00Z", "ground_code": "court_order"}],
 "revoked_devices": [{"device_id": "5c0e8f3a-71d2-4b6e-9a14-d8e2f7b30c59", "cert_serial": "1234567890123", "revoked_at": "2026-10-14T07:45:00Z"},
                     {"device_id": "a41d7b20-93c6-4e58-8f1b-0d6e2a9c5473", "pubkey_sha256": "ab12c4d7e9f0a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f607182930", "revoked_at": "2026-10-14T07:50:00Z"}]}

Что плеер делает со списком

Проверить список офлайн можно командой tanba-verify revocations list.p7s --ca root.pem: она печатает сначала согласования, затем устройства.