この機能は、クライアントが M3U8 ファイルをリクエストした際に、リクエストに含まれる認証パラメーターを `#EXT-X-KEY` タグ内のキー URI に自動的に追加します。これにより、オリジンサーバーを変更することなく暗号鍵へのアクセスを保護し、不正なビデオ再生を防ぎます。
利用シーン
標準的な HLS 暗号化ワークフローでは、#EXT-X-KEY タグが復号鍵を取得するための URI を指定します。この URI が固定された保護されていないパブリックアドレスである場合、M3U8 ファイルを取得した誰もがキーをダウンロードしてビデオコンテンツを復号できてしまい、暗号化が効果を失います。
この問題を解決するために、この機能は動的で検証可能な認証トークンを各キーリクエストに付与します。これは、以下のような HLS 暗号化キーのアクセス制御が必要なシナリオに最適です。
有料ビデオとオンライン教育:ユーザーが M3U8 の URL を非有料ユーザーと共有するのを防ぐために、ログインした各ユーザーに一意の認証パラメーターを生成できます。これにより、許可されたユーザーのみが有効期間内に復号鍵を取得できるようになります。
ライブストリームの著作権保護:大規模なスポーツイベントやライブブロードキャストの場合、動的に生成された認証パラメーターと CDN の URL 認証を組み合わせることができます。これにより、ライブストリームに対するきめ細かなアクセス制御が可能になり、ホットリンクを効果的に防止します。
仕組み
クライアントがアプリケーションサーバーにリクエストを送信します。ユーザーのログインなどのビジネスロジックに基づき、アプリケーションサーバーは有効期間と署名を持つ認証パラメーター (例:
token=xxxx) を生成し、クライアントに返します。クライアントはこの認証パラメーターを M3U8 ファイルのリクエスト URL の末尾に追加し、CDN の POP (Point of Presence) に M3U8 リクエストを送信します。
CDN の POP は M3U8 ファイルを返す前に、そのコンテンツを解析し、
#EXT-X-KEYタグを見つけ、クライアントのリクエスト URL からの認証パラメーターをタグのURI属性の末尾に追加します。クライアントは CDN から書き換えられた M3U8 ファイルを受け取り、認証パラメーターが含まれるようになった新しいキー URI を使用してキーサーバーにリクエストを送信します。
キーサーバーはキーリクエストを受け取り、URL から認証パラメーターを抽出して検証します。検証が成功した場合、復号鍵を返します。それ以外の場合は、リクエストを拒否します。
キーを取得した後、クライアントは TS ビデオストリームを復号し、再生を開始します。
この機能はビデオコンテンツを暗号化するものではありません。この機能を使用する前に、オリジンサーバー上のビデオセグメント (TS ファイル) が AES-128 などの HLS 標準に基づいて暗号化されていることを確認してください。元の M3U8 ファイルには、正しい #EXT-X-KEY タグも含まれている必要があります。ビデオの暗号化に関する詳細については、「M3U8 ファイルを生成して暗号化する方法は?」をご参照ください。
ここで説明されているアプリケーションサーバーとキーサーバーは、M3U8 の暗号化と書き換え機能を理解しやすくするためのものです。この機能は、アプリケーションサーバーやキーサーバーを実装するものではありません。HLS キー認証プロセスを完了するには、これらの機能を実装する必要があります。
#EXT-X-KEYタグは、コンテンツが暗号化されているかどうかを指定します。M3U8 ファイルのタグに関する詳細については、「HLS M3U8 ファイルには何が含まれていますか?」をご参照ください。
操作手順
-
CDN コンソールにログインします。
-
左側のナビゲーションウィンドウで、ドメイン名 をクリックします。
-
ドメイン名 ページで、対象のドメイン名を見つけ、操作 列の 管理 をクリックします。
-
ドメインのナビゲーションウィンドウで、ビデオ関連 をクリックします。
M3U8 の暗号化と書き換え セクションで、M3U8 の暗号化と書き換え スイッチをオンにします。
説明M3U8 の暗号化と書き換え を有効にすると、デフォルトのパラメーター名は
MtsHlsUriTokenになります。オプション:クライアントに合わせてパラメーター名を変更するには、次の手順を実行します。
カスタムパラメーター名 の横にある 変更 をクリックします。
カスタムパラメーター名 ダイアログボックスで、パラメーター名 を設定します。
値を指定しない場合、パラメーター名はデフォルトで
MtsHlsUriTokenになります。説明パラメーター名では大文字と小文字が区別されます。設定するパラメーター名がクライアントリクエストのパラメーター名と完全に一致することを確認してください。例えば、クライアントリクエストに
MtsHlsUriTokenパラメーターが含まれており、CDN コンソールでカスタムパラメーター名をmtshlsuritokenに設定した場合、設定は有効になりません。設定を完了するには、OK をクリックします。
例
ブラウザで CDN によって加速された M3U8 ファイルにアクセスし、リクエストの末尾に MtsHlsUriToken=tokenxxxxx を追加します。例:http://<CDN 加速ドメイン名>/video.m3u8?MtsHlsUriToken=tokenxxxxx
ブラウザの開発者ツールの [ネットワーク] パネルには、M3U8 ファイルのリクエストにはカスタムパラメーターが含まれていますが、後続のキーリクエストには含まれていないことが示されます。
CDN コンソールで、M3U8 の暗号化と書き換え を有効にします。必要に応じて、カスタムパラメーター名を設定できます (このデモではデフォルトのパラメーター
MtsHlsUriTokenを使用します)。CDN コンソールで、[M3U8 暗号化と書き換え] 機能を有効にし、[カスタムパラメーター名] をMtsHlsUriTokenに設定します。ステップ 1 を繰り返します。ブラウザで CDN 加速された M3U8 ファイルにアクセスし、リクエストの末尾に MtsHlsUriToken=tokenxxxxx を追加します。
ブラウザの開発者ツールの [ネットワーク] パネルで、キーアドレスのリクエストにカスタムパラメーターが含まれていることが確認できます。
キーファイル
encryption_key.keyのリクエスト URL にはMtsHlsUriToken=tokenxxxxxパラメーターが含まれ、レスポンスのステータスコードは 206、Content-Length は 16 バイトです。
よくある質問
HLS プロトコルとは何ですか?
HTTP ライブストリーミング (HLS) は、Apple が開発した HTTP ベースのストリーミングメディア転送プロトコルです。HTTP 上で動作し、クライアントはサーバーからファイルを順次ダウンロードできます。このプロトコルでは、ビデオは Transport Stream (TS) コンテナ形式である必要があります。TS ビデオファイルに加えて、HLS は M3U8 拡張子を持つテキストファイルを使用して再生を制御します。この M3U8 ファイルは、メディアセグメントのリストを含むプレイリストです。HLS は、ビデオストリームを小さな TS セグメントに分割することで機能します。再生を開始するために、クライアントはまず M3U8 プレイリストをダウンロードします。その後、クライアントはプレイリスト内の URL を使用して各メディアセグメントを順番にダウンロードします。
HLS M3U8 ファイルには何が含まれていますか?
M3U8 ファイルの基本的なタグ:
#EXTM3U:M3U8 ファイルヘッダーです。プレイリストの最初の行でなければなりません。EXT-X-MEDIA-SEQUENCE:プレイリスト内の最初の TS セグメントのシーケンス番号です。値は通常 0 です。ライブストリーミングでは、このシーケンス番号がライブセグメントの開始点を識別します。例:#EXT-X-MEDIA-SEQUENCE:0。#EXT-X-TARGETDURATION:メディアセグメントの最大期間です。例:#EXT-X-TARGETDURATION:10は、各セグメントの最大期間が 10 秒であることを示します。#EXT-X-ALLOW-CACHE:クライアントがメディアセグメントをキャッシュできるかどうかを示します。値は#EXT-X-ALLOW-CACHE:YESまたは#EXT-X-ALLOW-CACHE:NOです。デフォルト値は YES です。#EXT-X-ENDLIST:プレイリストの終わりを示します。#EXTINF:持続時間や帯域幅など、メディアセグメントに関する追加情報です。形式は通常#EXTINF:<duration>,[<title>]です。カンマの前の値は現在のメディアセグメントの持続時間です。セグメント期間は#EXT-X-TARGETDURATIONタグの値以下でなければなりません。#EXT-X-VERSION:M3U8 プレイリストのバージョン番号です。#EXT-X-DISCONTINUITY:このタグは、先行するメディアセグメントと後続のメディアセグメントの間に中断があることを示します。#EXT-X-PLAYLIST-TYPE:ストリームのタイプを示します。#EXT-X-KEY:暗号化されたメディアセグメントを復号する方法を指定します。例:#EXT-X-KEY:METHOD=AES-128,URI="https://example.com/video.key?token=xxx"。この例は、暗号化アルゴリズムが AES-128 であることを示します。キーはhttps://example.com/video.key?token=xxxにリクエストを送信して取得します。キーが取得されると、ローカルに保存され、後続の TS ビデオファイルの復号に使用されます。
M3U8 ファイルを生成して暗号化する方法は?
暗号鍵を生成します。
このキーは通常、AES-128 暗号化用の 16 バイトのランダムな文字列です。OpenSSL を使用して、次のコマンドを実行することで 16 バイトのランダムなバイトを含むキーファイルを生成できます。
openssl rand 16 > encryption_key.key暗号化用の
key_info.txtファイルを準備します。暗号化ツールは、このファイルに基づいて HLS ビデオファイルを暗号化します。https://example.com/encryption_key.key /path/to/local/encryption_key.key最初の行は、ステップ 1 で生成した暗号鍵の URL です。ファイルを CDN で加速された OSS オリジンサーバーに配置し、CDN 加速ドメイン名を使用してファイルにアクセスすることを推奨します。
2 行目は、ローカルキーファイルの絶対パスです。
FFmpegツールを使用して HLS ビデオファイルを生成し、暗号化します。ffmpeg -i input_video.mp4 -c:v copy -c:a copy -hls_time 10 -hls_key_info_file key_info.txt -hls_list_size 0 output_playlist.m3u8-i input_video.mp4:変換するビデオファイル (MP4形式のビデオなど) を指定します。-c:v copy:ビデオストリームを再エンコードせずに直接コピーします。-c:a copy:オーディオストリームを再エンコードせずに直接コピーします。-hls_time 10:各TSファイルの持続時間を 10 秒に設定します。元のビデオの持続時間に基づいてこの設定を変更できます。-hls_key_info_file key_info.txt:暗号鍵情報を含むファイルを指定します。-hls_list_size 0:M3U8ファイルに保持するTSファイルのインデックス数を設定します。値0は、すべての.tsファイルのインデックスが保持されることを示します。output_playlist.m3u8:出力 HLS プレイリストファイル名 (つまり、M3U8ファイル名) です。
暗号化された
TSファイルとM3U8ファイルをサーバー (CDN で加速された OSS オリジンサーバーなど) に保存します。その後、ブラウザで CDN 加速ドメイン名を使用してM3U8ファイルにアクセスし、HLSプロトコルを使用するビデオの暗号化再生を有効にします。