Skip to content

Шифрование раздачи

Правообладатель премиального контента требует, чтобы поток не уходил зрителю открытым. Стример умеет шифровать то, что покидает его: зритель получает шифротекст и адрес, по которому его плеер попросит лицензию. Настраивается в блоке Шифрование раздачи (DRM) на вкладке Отдача стрима — и точно так же в шаблоне стрима, если стримов много.

Шифруется выход, а не запись. Архив на стримере остаётся открытым, поэтому перемотка, превью, перекодирование и распознавание субтитров продолжают работать как у обычного стрима.

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

Обратная задача — забрать зашифрованный источник — решается на входе стрима, а не здесь: см. Источник MPEG-DASH.

Включите шифрование

Переключатель Шифровать раздачу включает блок. Дальше выберите Источник ключа:

  • В настройках — ключ задаёте вы сами. Годится, когда ключ выдаёт не сервер, а договорённость с правообладателем.
  • Сервер ключей (SPEKE) — ключ запрашивается у внешнего сервера по протоколу SPEKE. Так работают промышленные DRM-сервисы.

Блок шифрования: ключ из настроек и система ClearKey

Посмотрите, как это работает, на ClearKey

Чтобы увидеть шифрование целиком — от фрагмента до картинки в браузере, — коммерческий DRM не нужен: ClearKey проигрывается обычным браузером, а лицензию выдаёт сам стример. Защиты этот режим не даёт, ключ уезжает плееру открытым — зато весь тракт проверяется за минуту и без единой подписки.

  1. На вкладке Отдача включите Шифровать раздачу.
  2. Источник ключаВ настройках. В Значение ключа впишите 32 шестнадцатеричных символа, например 00112233445566778899aabbccddeeff. Идентификатор ключа оставьте пустым.
  3. В Системах защиты оставьте одну ClearKey.
  4. Сохраните и откройте Страницу плеера — ссылка на неё в блоке Как забрать поток ниже на той же вкладке.

Картинка пойдёт как обычно, и это и есть результат: фрагменты уехали зашифрованными, плеер запросил у стримера лицензию, получил ключ и расшифровал их сам.

Зашифрованный стрим играет в браузере

Что здесь происходит на самом деле, показывают две проверки.

В плейлисте появился ключ. У зашифрованного стрима перед списком качеств стоит строка с системой защиты, у обычного её нет:

curl -s http://<адрес>/streaming/v/<имя>/index.m3u8 | grep KEY
#EXT-X-SESSION-KEY:METHOD=SAMPLE-AES,URI="data:text/plain;base64,...",KEYFORMAT="org.w3.clearkey"

Протокол без шифрования отказывает. MPEG-TS шифровать сервер не умеет и потому не отдаёт такой стрим вовсе:

curl -s -o /dev/null -w '%{http_code}\n' http://<адрес>/streaming/mpegts/<имя>
403

Сохранённый ключ консоль больше не показывает — в поле стоит <redacted>, как на снимке выше. Значение ключа не отдаётся ни в API, ни в логи; чтобы поставить другой, впишите новый поверх.

Ключ в настройках

  • Значение ключа — 32 шестнадцатеричных символа (AES-128).
  • Идентификатор ключа — можно оставить пустым: тогда он выводится из идентификатора контента и соли.

Сервер ключей

  • Адрес сервера ключей — туда уходит CPIX-документ с запросом. Дальше ключ этот стример не покидает.
  • Версия SPEKE — версия протокола, о которой договорились с сервером.

Блок шифрования с источником «Сервер ключей»

Что шифровать

Поле Что шифровать задаёт полноту:

  • Все видеосэмплы — умолчание и то, чего обычно требует правообладатель.
  • Только опорные кадры — заметно дешевле по процессору: разностные кадры без опорного всё равно не декодируются.

Звук шифруется в обоих режимах: он дешёвый, а без него защита содержимого бессмысленна.

Системы защиты

Системы защиты — список тех, кому объявляется защита: Widevine, PlayReady, FairPlay, ClearKey. Выбрать нужно хотя бы одну: шифровать, не сказав ни одному плееру, чем расшифровывать, — это раздача, которую никто не сможет посмотреть.

ClearKey — демонстрационный режим, защиты он не даёт: ключ отдаётся плееру как есть. Он существует затем, чтобы весь путь — от шифрования до проигрывания — проверялся обычным браузером, без покупки коммерческого DRM. На боевом контенте выбирайте систему, у которой лицензия выдаётся защищённо.

Идентификатор контента и соль

  • Идентификатор контента — пусто означает имя стрима. Несколько стримов, которые должны шифроваться одним ключом, называют здесь общий идентификатор.
  • Соль идентификатора ключа — секретом не является: нужна лишь затем, чтобы идентификаторы двух установок не совпали.

Оба поля влияют на идентификатор ключа, поэтому их правка меняет то, что объявлено плееру.

Ключ у стрима один

Ключ выдаётся стриму один раз и не меняется, пока стрим работает: ротации ключа нет.

  • Вся лесенка качеств шифруется одним ключом — и 1080p, и 360p, и звук.
  • Архив шифруется тем же ключом, что и живой край. Перемотка на неделю назад не требует ни второго ключа, ни второго похода к серверу ключей.
  • В плейлисте один тег ключа на всё окно — групп сегментов под разными ключами не возникает.

Ключ меняется только вместе с настройками: правка Значения ключа, Идентификатора контента или Соли идентификатора ключа — это новый ключ, и стрим начинает шифроваться им. Зритель, который смотрел в этот момент, продолжит смотреть: плеер запросит лицензию заново, как при смене кодека.

Пока ключа нет, раздачи нет

Шифрование само по себе не ломается — ломается получение ключа, и следить стоит именно за ним.

Пока ключ не получен, зашифрованный стрим не раздаётся вовсе: запрос медиа завершается ошибкой. Открытым содержимым такой стрим не отвечает ни при каких обстоятельствах — недоступность сервера ключей гасит раздачу, а не снимает шифрование.

Что бывает с сервером ключей:

  • Не ответил — стрим не раздаётся. Как только сервер ответит, раздача возобновится сама: без перезапуска стрима и без дырки в архиве.
  • Отдал не все запрошенные системы — ответ отвергается целиком. Если выбраны Widevine и FairPlay, а в ответе только Widevine, ключ не принимается: неполная сигнализация означала бы, что часть зрителей молча не может смотреть.
  • Ответил не тем — не CPIX-документом или неразбираемым XML: ключ не принимается, причина попадает в лог стримера. Значения ключей в лог не пишутся никогда.

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

Что перестаёт работать

У зашифрованного стрима отказывают поверхности, для которых шифрования нет: пул MPEG-TS и его HLS-поддерево, MP4-превью архива, лента архива для RTSP, WebRTC и SRT-раздача. Отказ — намеренный: раздать такому стриму открытое медиа означало бы обойти защиту.

Продолжают работать: JPEG-превью и миниатюры, WebVTT-субтитры и пуши стрима.

Раздающие стримеры

Ключ остаётся на стримере, принявшем источник, — на origin. Соседние стримеры, эджи, получают тот же шифротекст, что и зритель, и раздают его дальше, объявляя защиту в плейлистах и манифестах, — но ключа у них нет, и в их настройках его нет тоже. Скомпрометированный раздающий стример не отдаёт открытого медиа.

К серверу ключей ходит только стример, принявший источник, поэтому число обращений к нему зависит от числа стримов, а не от размера кластера.

Если у раздающего стримера настроены кэш-диски, шифротекст оседает на них как есть, и повторное обращение к тому же фрагменту обслуживается локально. Расшифровать кэш стример по-прежнему не может: он отдаёт ровно те байты, что приехали. В архив шифротекст не попадает — архив кормит превью, миниатюры и ленту, а всё это заглядывает внутрь картинки.

Переход с Flussonic

Стрим, у которого в Flussonic Media Server было настроено шифрование, импорт переносит выключенным и называет причину в отчёте. Настройки шифрования не переезжают: у Flussonic полтора десятка вендоров ключей против одного SPEKE, и перенести их дословно нельзя. Шифрование настраивается заново — так надёжнее, чем канал, который после импорта заработал бы открытым.