Форматы конверта согласования и списка отзыва
Два подписанных файла решают, что плеер вправе показывать: конверт согласования, который идет с каждым медиафайлом, и список отзыва, который отзывает согласование. Эта страница описывает оба, чтобы плеер, CMS или программа проверки могли прочитать их без нашего программного обеспечения.
Страницы справочника: Форматы конверта согласования и списка отзыва и Протокол устройства.
Пакет согласования
Согласованный ролик доставляется двумя файлами с опубликованным именованием: медиафайл и его конверт, например spot.mp4 и spot.mp4.p7s. Конверт согласования можно скачать через API интеграции (GET /api/v1/approvals/{number}/envelope, право read:approvals). Конверт без файла, который он называет, бесполезен, а файлу без конверта на экране быть нельзя.
Конверт
Конверт это один CMS SignedData в формате DER (файл .p7s). Подписанное содержимое это манифест согласования в каноническом JSON (RFC 8785), который называет медиафайл по его SHA-256.
Боевое согласование несет две подписи (тестовый контур может выпускать и конверты с одной подписью, о чем сказано в примечании манифеста):
- Подпись платформы, ECDSA P-256 с SHA-256, сделанная ключом согласований платформы. Любой плеер может проверить ее офлайн.
- Собственная государственная подпись согласующего (подпись GOST 2015, сделанная в NCALayer). Подпись платформы фиксирует 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"}]}
versionрастет на единицу с каждым новым списком. Новый список выпускается сразу, когда отозвано согласование или устройство, а также периодически.- Отзыв окончателен: списки только растут. Запись никогда не уходит из списка, а платформа отказывается выпускать список, в котором она пропала.
- На канале сертификата по записи на каждый серийный номер сертификата, который когда-либо был у устройства, в десятичной записи. На подписанном канале запись несет
pubkey_sha256, SHA-256 открытого ключа в DER в hex. Список безrevoked_devicesозначает, что таких нет. ground_codeэто код правового основания отзыва.
Что плеер делает со списком
- Он хранит новейший из виденных списков. Список, чья
versionне выше используемой, игнорируется, как и список с истекшимnot_after, поэтому устаревший список не вернет отозванное согласование. - Согласование из списка отклоняется как
REVOKED. - Записи устройств, которые не его, он игнорирует. Если в списке его собственный идентификатор, он переходит в состояние
revoked: черная страница, никаких показов, никаких heartbeat и телеметрии, и так остается и после перезапуска. Плеер, получившийdevice_unauthorized, читает публичный список сам, чтобы понять причину.
Проверить список офлайн можно командой tanba-verify revocations list.p7s --ca root.pem: она печатает сначала согласования, затем устройства.