Edited at

AWS MediaLive で HLS AES-128 暗号化!

今回は AWS MediaLive でそもそも HLS AES暗号化ってどーやんの? とふと思って調べたところ、公式ドキュメントに詳しく記されておらず、コンソールの info をクリックしてもたいしたこと書いてないし、ggってもこれだ! ってのが見つけられなかったので、自分でまとめることにしました。

AWS Elemental MediaLive User Guide

https://docs.aws.amazon.com/ja_jp/medialive/latest/ug/hls-group-fields.html


AWS MediaLive 設定

MediaLive + MediaStore 使って配信する前提です。

MediaLive + WebDAV でも利用できますが、 MediaLive + MediaPackage の場合には MediaPackage 側で再パッケージされるので多分使えないような気がします(未確認)

尚、MediaLive で DRM 設定以外は完了している状態から始めていきます。

※ MediaLive + MediaStore 配信設定は streampack チームの影のドン hagi さんの記事を参照下さい。

MediaLive->MediaStoreでライブ配信するには


DRM 設定

AWS Elemental MediaLive > Channels > Edit > Output groups で HLS groups を開きます。

スクリーンショット 2018-06-29 16.13.08.png

デフォルトでは以下のようになっているので各項目を設定していきます。

スクリーンショット 2018-06-29 16.14.08.png

設定項目とその内容です。

設定項目
設定値
備考

Encryption Type
AES128

Key Format
空欄
空欄だと"identity"が利用されます

Key Format Versions
空欄
省略可能

Include IV in Manifest
INCLUDE
INCLUDEでマニフェストにIVが記載されます

IV Source
FOLLOWS_SEGMENT_NUMBER
FOLLOWS_SEGMENT_NUMBERの場合、セグメント番号に合致するようにセグメントごとにIVが変更されます。EXPRICITでは任意IVを設定します

Constant IV
空欄
IV SourceでEXPRICITを選択した場合に任意の値を指定

Key Provider Settings
Static key

Static Key Value
任意の値
16進32文字の値を指定

Key Provider Server
Key Provider Server

URI
任意の URI
key ファイルの場所

Username
空欄

Password
空欄

さて、気になるところを少し解説していきます。


Static Key Value

MediaLive では勝手にキーを作ってくれないので自力で作成する必要があります。

16進32文字の値なので openssl で作ります。

$ openssl rand 16 > aes128.key

作成したキーからStatic Key Value に設定する値を抽出します。

$ xxd -ps aes128.key

122e96c6628d8757da801e2f12eb222b

この122e96c6628d8757da801e2f12eb222bStatic Key Valueに設定します。


URI

MediaLive では勝手にキーファイルを置いてくれないので上記で作成したキーファイルを S3 なり MediaStore なり Web Server なりで公開して、その URL を指定します。

例:

https://s3-ap-northeast-1.amazonaws.com/{S3 bucket}/keys/aes128.key

全部埋めるとこんな感じ!

スクリーンショット 2018-06-29 17.48.36.png

設定が完了したら Update channel でチャンネルを更新します。


視聴確認


MediaLive

チャンネルを選択し、Start で開始します。


Encoder

何でもよいですが今回は ffmpeg でファイルから擬似ライブ配信します。

$ ffmpeg -re -stream_loop -1 -i bigbuckbunny_1500.mp4 -vcodec copy -acodec copy -flags +loop-global_header -f flv "rtmp://xxx.xxx.xxx.xxx:1935/live/stream"


Player

Safari で視聴します。

視聴 URL

https://xxxx.data.mediastore.ap-northeast-1.amazonaws.com/destA/test.m3u8

スクリーンショット 2018-06-29 17.23.28.png

キーファイルを取得してるのが確認できます。

映像も復号化されて正常に表示されます。


プレイリストファイル

m3u8 プレイリストの内容です。


test_1.m3u8

#EXTM3U

#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:12
#EXT-X-MEDIA-SEQUENCE:21
#EXT-X-KEY:METHOD=AES-128,URI="https://s3-ap-northeast-1.amazonaws.com/{S3 bucket}/keys/aes128.key",IV=0x00000000000000000000000000000015
#EXTINF:11.25000,
test_1_00021.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://s3-ap-northeast-1.amazonaws.com/{S3 bucket}/keys/aes128.key",IV=0x00000000000000000000000000000016
#EXTINF:11.25000,
test_1_00022.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://s3-ap-northeast-1.amazonaws.com/{S3 bucket}/keys/aes128.key",IV=0x00000000000000000000000000000017
#EXTINF:11.25000,
test_1_00023.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://s3-ap-northeast-1.amazonaws.com/{S3 bucket}/keys/aes128.key",IV=0x00000000000000000000000000000018
#EXTINF:11.25000,
test_1_00024.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://s3-ap-northeast-1.amazonaws.com/{S3 bucket}/keys/aes128.key",IV=0x00000000000000000000000000000019
#EXTINF:11.25000,
test_1_00025.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://s3-ap-northeast-1.amazonaws.com/{S3 bucket}/keys/aes128.key",IV=0x0000000000000000000000000000001A
#EXTINF:11.25000,
test_1_00026.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://s3-ap-northeast-1.amazonaws.com/{S3 bucket}/keys/aes128.key",IV=0x0000000000000000000000000000001B
#EXTINF:11.25000,
test_1_00027.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://s3-ap-northeast-1.amazonaws.com/{S3 bucket}/keys/aes128.key",IV=0x0000000000000000000000000000001C
#EXTINF:11.25000,
test_1_00028.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://s3-ap-northeast-1.amazonaws.com/{S3 bucket}/keys/aes128.key",IV=0x0000000000000000000000000000001D
#EXTINF:11.25000,
test_1_00029.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://s3-ap-northeast-1.amazonaws.com/{S3 bucket}/keys/aes128.key",IV=0x0000000000000000000000000000001E
#EXTINF:11.25000,
test_1_00030.ts


まとめ

今回試してみてわかったことです。


  • MediaLive はキーファイルを作成してくれない

  • MediaLive はキーファイルを置いてもくれない

  • 固定キーしか対応していないのでキーローテートはできない

  • ドキュメントが優しくない

ETSでは HLS AES キーを生成できるのに MediaLive/MediaConvert では別途作成、配置する必要があります。

AES暗号化は市場で普通に使われている機能なので、同サービス内で完結できるようにしてくれると嬉しいところです。