ACS 認証および ACS トークン認証による PlayReady 保護のエンドツーエンド プロトタイプ
このポストは、11 月 17 日に投稿された An End-to-End Prototype of PlayReady Protection with ACS Authentication and ACS Token Authorization の翻訳です。
はじめに
このエンドツーエンドのプロトタイプはアジアおよびヨーロッパのお客様からのご要望にお応えしたものです。
Azure Media Services の Content Protection (コンテンツ保護) サービスには以下が含まれます。
- PlayReady ライセンス提供サービス
- AES-128 クリア キー配信サービス
- 配信時における動的 PlayReady 保護または AES 暗号化
- メディア処理ワークフローにおける静的 PlayReady 保護または AES 暗号化
注目すべきは、Azure Media Services の動的 PlayReady 保護機能によって “ワンクリック DRM” が実現されることです。お客様やパートナーの皆様は、“従来型 DRM” で必要とされる以下の手順を踏む必要がなくなります。
- PlayReady サービス ライセンスの確保
- PlayReady ライセンス サーバー ファームのセットアップ
- PlayReady パッケージング ワークフローによるアセットの保護
“ワンクリック” で、そして Web ページの更新だけでアセットの保護または保護の解除を行えます。
通常、DRM ソリューションは複数の入れ替え可能なパーツで構成されますが、DRM ソリューションの基本要素については、ブログ記事「Azure Media Services の PlayReady ライセンス提供サービスの使用におけるソリューション設計上の考慮事項 (英語)」で概説しています。今回の記事では、完全にエンドツーエンドのプロトタイプが求められていましたのでその作成を目指します。
エンドツーエンドのプロトタイプ
設計と機能
以下のことが可能なエンドツーエンドのプロトタイプを用意することが今回の目標です。
- トークン制限を使用した AMS のアセットの PlayReady 動的保護 (または静的保護)
- Azure Media Services ライセンス提供サービスによる PlayReady ライセンスの提供
- Azure ACS (英語) (Microsoft Azure Active Directory Access Control Service) を STS とした SWT 認証トークンの発行
- Silverlight プレーヤーは以下を実行
- ACS サービス ID で認証を受ける
- ACS から認証トークンを取得
- ACS トークンを使用して AMS ライセンス提供サービスから PlayReady ライセンスを取得
- ビデオ再生用に Smooth Streaming または MPEG-DASH アセットをダウンロード
Silverlight プレーヤーを選択したのは、次の理由からです。
- IE、Chrome、Firefox などの広く普及しているブラウザーで利用できる
- Smooth Streaming Client 2.5 (英語) は PlayReady クライアントをサポートしており、PlayReady クライアント ライセンスが不要
- Smooth Streaming Client 2.5 (英語) は MPEG-DASH もサポートしている (今回のエンドツーエンド プロトタイプは Smooth Streaming だけでなく MPEG-DASH にも対応しています)
下図で、このエンドツーエンド プロトタイプの設計を図解しています。筆者のブログ記事「Azure Media Services の PlayReady ライセンス提供サービスの使用におけるソリューション設計上の考慮事項 (英語)」で使用した一般的な DRM ソリューションの図を修正したものです。
エンドツーエンド プロトタイプは Azure および Azure Media Services にホストされます。これに関連する情報は以下のとおりです。
- PlayReady 動的保護対象の Smooth Streaming アセットの URL
- PlayReady 動的保護対象の MPEG-DASH アセットの URL
- PlayReady ライセンス取得用 URL (英語)
- PlayReady ライセンスの種類: 非永続 (テストをいつでも何回でも繰り返し実行可能)
- SWT 認証トークンを発行する Azure ACS 名前空間の URL
- Silverlight プレーヤーの URL (英語)
- 認証ポリシーの制限事項
<TokenRestrictionTemplate xmlns:i="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://schemas.microsoft.com/Azure/MediaServices/KeyDelivery/TokenRestrictionTemplate/v1">
<AlternateVerificationKeys>
<TokenVerificationKey i:type="SymmetricVerificationKey">
<KeyValue>(portion deleted) Yw1z2wxh6ZkX4tRl/WVhBTvM6T/vUo=</KeyValue>
</TokenVerificationKey>
</AlternateVerificationKeys>
<Audience>urn:test</Audience>
<Issuer>https://willzhanacs.accesscontrol.windows.net/</Issuer>
<PrimaryVerificationKey i:type="SymmetricVerificationKey">
<KeyValue>(portion deleted) A8RlVMrPNhukYBF2sW04UMpuD8bw=</KeyValue>
</PrimaryVerificationKey>
<RequiredClaims />
</TokenRestrictionTemplate>
実行方法
テスト プレーヤーを使用してこのプロトタイプを実行する手順は次のとおりです。
- プレーヤー (英語) にアクセスします。
- URL を入力できるように [Add URL] チェックボックスをオンにします。
- [Add AuthN ACS Token] チェックボックスをオンにします。これにより、最初に ACS 認証トークンを要求し、それを使用して [LA_URL] テキスト ボックスで指定されているライセンス取得 URL からの PlayReady ライセンス取得を行います。
- Smooth Streaming アセット URL または MPEG-DASH アセット URL をコピーして、[SRC_URL] テキスト ボックスに貼り付けます。次に、[Add to Playlist] ボタンをクリックして再生します。
ボタンをクリックするとプレーヤーで以下が実行されます。
- PlayReady 動的保護対象アセットのクライアント マニフェストをダウンロード
- サービス ID 経由で ACS 2.0 名前空間により認証を受ける
- 認証トークンを ACS から要求
- ACS トークンを使用して LA_URL から PlayReady ライセンスを要求
- 暗号化を解除し、PlayReady の制限事項および権利の確認後ビデオを再生
当然のことですが、[Add AuthN ACS Token] チェックボックスをオフにしてボタンをクリックすると、ACS 名前空間からの認証トークンがないため PlayReady ライセンスの取得に失敗します。
実装
実装は以下のとおりです。
- Azure Media Services の .NET API を使用して、Smooth Streaming アセットの PlayReady 動的保護を構成します。
- コンテンツ キー ID およびコンテンツ キーを生成します。
- キー配信サービスを構成します。
- アセット配信ポリシー経由で動的 PlayReady 保護を構成します。
- アセットを発行します。
- Azure ACS 2.0 名前空間をセットアップしてプレーヤー クライアントを認証し、認証トークンを発行します。
- 認証、承認、ライセンス取得、ビデオ再生を実行する Silverlight プレーヤーを開発します。
コンテンツ キーの生成
コンテンツ キー ID とコンテンツ キーはさまざまな方法で生成できます。詳細については、筆者のブログ (英語) の「Key Generation and Management (キーの生成と管理)」セクションを参照してください。たとえば、以下の方法があります。
string keySeedB64, contentKeyB64;
Guid keyId = Guid.NewGuid();
//Guid keyId = new Guid("09a2212a-a803-4989-9a6e-6cd2e69500e7");
//方法 1: キー シードを使用せずコンテンツ キーを直接生成
//contentKeyB64 = GeneratePlayReadyContentKey();
//方法 2: 特定のキー シードと生成されたキー ID を使用 (キー識別子はシステムで一意なので、特定の GUID を持つキーはクラスター内に 1 つしか存在しません。現在はすべてのアカウントが対象ですが、将来的には指定スコープ内のアカウントに変更される可能性があります)。既存のキー ID と異なるキー値の保護ジョブを送信しようとすると、PlayReady 保護ジョブを正常に実行できません (キー ID とキー値が同じ場合は問題ありません)。
keySeedB64 = "XVBovsmzhP9gRIZxWfFta3VVRPzVEWmJsazEJ46I";
contentKeyB64 = GetPlayReadyContentKeyFromKeyIdKeySeed(keyId.ToString(), keySeedB64);
//方法 3: ランダムに生成されたキー シードを使用して、キー ID とキー シードからコンテンツ キーを作成
//keySeedB64 = GeneratePlayReadyKeySeed();
//contentKeyB64 = GetPlayReadyContentKeyFromKeyIdKeySeed(keyId.ToString(), keySeedB64);
//方法 4: 既存のキー ID を再利用 (1 回のみ、テスト用)
//keyId = new Guid("a7586184-40ff-4047-9edd-6a8273ac50fc");
//keySeedB64 = "XVBovsmzhP9gRIZxWfFta3VVRPzVEWmJsazEJ46I";
//contentKeyB64 = GetPlayReadyContentKeyFromKeyIdKeySeed(keyId.ToString(), keySeedB64);
Console.WriteLine(string.Format("STEP 1: Key ID = {0}, Content Key = {1}, Key Seed = {2}", contentKeyB64, keyId.ToString(), keySeedB64));
以下のユーティリティ メソッドはキー ID およびキー シードの生成に使用します。
public static byte[] GenerateCryptographicallyStrongRandomBytes(int length)
{
byte[] bytes = new byte[length];
//この型は IDisposable インターフェイスを実装します。型の使用が終わったら、直接または間接的に破棄する必要があります。型を直接破棄するには、try/catch ブロックで Dispose メソッドを呼び出します。型を間接的に破棄するには、using (C# の場合) などを使用します。
using (var rng = new System.Security.Cryptography.RNGCryptoServiceProvider())
{
rng.GetBytes(bytes);
}
return bytes;
}
//PlayReady コンテンツ キーを生成: GenerateCryptographicallyStrongRandomBytes(16)
public static string GeneratePlayReadyContentKey()
{
byte[] bytes = GenerateCryptographicallyStrongRandomBytes(16);
return Convert.ToBase64String(bytes);
}
public static string GeneratePlayReadyKeySeed()
{
byte[] bytes = GenerateCryptographicallyStrongRandomBytes(30); //キー シードは 30 (https://msdn.microsoft.com/ja-jp/library/hh973610.aspx)
return Convert.ToBase64String(bytes);
}
public static string GenerateSymmetricHashKey()
{
byte[] bytes = GenerateCryptographicallyStrongRandomBytes(32);
return Convert.ToBase64String(bytes);
}
//この API は、PlayReady Server SDK の AESContentKey コンストラクターと同様に機能
public static string GetPlayReadyContentKeyFromKeyIdKeySeed(string keyIdString, string keySeedB64)
{
Guid keyId = new Guid(keyIdString);
byte[] keySeed = Convert.FromBase64String(keySeedB64);
byte[] contentKey = CommonEncryption.GeneratePlayReadyContentKey(keySeed, keyId);
string contentKeyB64 = Convert.ToBase64String(contentKey);
return contentKeyB64;
}
Azure Media Services のコード
Azure Media Services 側で保護されてない Smooth Streaming アセットがある場合、以下の手順を実行します。
- そのアセットが持つロケーターを削除します。このロケーターがあると次の手順に進めません。
- アセット配信ポリシーがあればすべて削除します。
- ライセンス提供サービスを構成します。
- トークン制限による動的 PlayReady 保護を構成します。
- アセットを発行します。
PlayReady キー配信サービスと入力アセットの動的保護をセットアップするコードは GitHub Azure/azure-media-services-samples/PlayReadyACSE2E_AMS_Code (英語) を参照してください。
ACS のセットアップ
Azure ACS 2.0 名前空間の構成手順については、Mingfei Yan のブログ記事「Media Services キー サービスを使用した ACS の構成方法 (英語)」を参照してください。
一般に 2 つの認証方法があります。
- エンド ユーザーが ID プロバイダーによる認証を受けて、プレーヤーをホストする Web アプリケーション (いわゆる証明書利用者) へのアクセス権を取得。このプロトタイプでは、ユーザー認証なしに Web アプリケーションにアクセスできるようにしているため、Web アプリケーション用 ID プロバイダーは必要ありません。
- クライアント/自律アプリケーションが ACS 2.0 名前空間による認証を受けて、アクセス権とトークンを取得。ID プロバイダーは使用せず ACS で直接認証を行うために、サービス ID を指定します。クライアントはこのサービス ID を使用して ACS による認証を受け、ACS 名前空間から認証トークンを要求します。
以下は、この ACS 2.0 名前空間により発行されたトークンの一例です。
http%3a%2f%2fschemas.xmlsoap.org%2fws%2f2005%2f05%2fidentity%2fclaims%2fnameidentifier=willzhan&http%3a%2f%2fschemas.microsoft.com%2faccesscontrolservice%2f2010%2f07%2fclaims%2fidentityprovider=https%3a%2f%2fwillzhanacs.accesscontrol.windows.net%2f&Audience=urn%3atest&ExpiresOn=1415800463&Issuer=https%3a%2f%2fwillzhanacs.accesscontrol.windows.net%2f&HMACSHA256=ylYe9U18Ea1OfGJ%2fn2hzYfsm3XcM9X1HI2pBgUk54Eo%3d
注: PlayReady 動的保護を構成する際は、ACS 2.0 名前空間で使用したのと同じ (プライマリ) 対称ハッシュ キーを使用してください。特に、PlayReady 動的保護をプログラムを使用してセットアップする場合は、IContentKeyAuthorizationPolicy で使用した制限要件を作成する必要があります (以下を参照)。
public static string CreateRestrictionRequirements()
{
string primarySymmetricKey = System.Configuration.ConfigurationManager.AppSettings["PrimarySymmetricKey"];
string secondarySymmetricKey = System.Configuration.ConfigurationManager.AppSettings["SecondarySymmetricKey"];
string scope = System.Configuration.ConfigurationManager.AppSettings["AcsScope"];
string issuer = System.Configuration.ConfigurationManager.AppSettings["AcsIssuer"];
TokenRestrictionTemplate objTokenRestrictionTemplate = new TokenRestrictionTemplate();
objTokenRestrictionTemplate.PrimaryVerificationKey = new SymmetricVerificationKey(Convert.FromBase64String(primarySymmetricKey));
objTokenRestrictionTemplate.AlternateVerificationKeys.Add(new SymmetricVerificationKey(Convert.FromBase64String(secondarySymmetricKey)));
objTokenRestrictionTemplate.Audience = new Uri(scope);
objTokenRestrictionTemplate.Issuer = new Uri(issuer);
return TokenRestrictionTemplateSerializer.Serialize(objTokenRestrictionTemplate);
}
primarySymmetricKey 変数には ACS 2.0 管理ポータルから取得したのと同じ対称ハッシュ キー文字列を格納します (下図参照)。
クライアント サイドのコード
ACS から認証トークンを要求するクライアント サイドのコードや Silverlight 内のカスタム ライセンス取得機能のコードは、GitHub Azure/azure-media-services-samples/PlayReadyACSE2E_Client_COde (英語) を参照してください。
プレーヤー アプリケーションは以下を実行します。
- 最初に、PlayReady 保護対象の Smooth Streaming アセットのマニフェストを要求し、マニフェストの ProtectionHeader をチェックします。
- PlayReady ライセンスを要求するために、プレーヤーは認証トークン (1 つ前のセクションで作成) を ACS 名前空間から取得する必要があります。Silverlight のコード量を抑えるには、このコードを (WCF または REST) サービスに配置し、Silverlight アプリケーションからサービスを呼び出して ACS トークンを取得させることを検討してください。ACS トークンを取得したら、プロパティ (Constants.Acs トークン) に保存して、すぐにライセンス取得機能が使用できるようにします。
- カスタム ライセンス取得機能はこの ACS トークンを使用して、AMS ライセンス提供サービス (前述のセクションで構成) から PlayReady ライセンスを取得します。
デプロイメント
筆者のブログ (英語) で使用したシステム図や前出のシステム図に示すように、このエンドツーエンド プロトタイプには以下の物理コンポーネントが含まれます。
- コンテンツ キーおよびコンテンツ キー ID
- Azure Media Services のビデオ アセット (未保護) および Azure Media Services のストリーミング ソース
- Azure Media Services のアセットに設定した PlayReady 動的保護
- Azure Media Services で構成した PlayReady ライセンス提供サービス
- Azure ACS 2.0 名前空間で構成した STS
- ASP.NET アプリケーションの Silverlight ビデオ プレーヤー
ソリューションは Azure Media Services を基盤としているので、デプロイする必要があるのはビデオ プレーヤーをホストする ASP.NET Web アプリケーションだけです。デプロイ先の選択肢は以下のとおりです。
- Azure Websites
- Azure IaaS VM
- オンプレミス サーバー
HTTP プロセス アクティブ化サービスがサーバーにインストールされていることを確認してください。そうでない場合は、WCF サービスは正しく機能しません。また、PlayReady 動的保護を使用するには、最低でも 1 RU をストリーミング ソースに構成してください。
まとめ
この記事では、Azure Media Services PlayReady ソリューションのエンドツーエンド プロトタイプをご紹介しました。これには、DRM ソリューションの以下の主要コンポーネントがすべて含まれます。
- コンテンツ キー ID およびコンテンツ キーの生成
- Azure Media Services のストリーミング ソース
- Azure Media Services PlayReady 動的保護機能による PlayReady 保護
- Azure Media Services PlayReady ライセンス提供サービスによる PlayReady ライセンス提供
- Azure ACS 2.0 による STS (Secure Token Service) のプレーヤー クライアント認証と認証トークンの発行
- ACS 認証、ACS 承認、PlayReady ライセンス取得、およびビデオ再生を行う、Azure IaaS VM にホストされたビデオ プレーヤー アプリケーション
謝辞: Microsoft Azure Media Services チームの Quintin Burns および Mingfei Yan の協力に深く感謝いたします。