ビデオ暗号化機能を使用すると、ビデオを暗号化できます。 この機能は、オンライン教育や金融などのシナリオでのビデオリークやホットリンクを防ぐために広く使用されています。 ApsaraVideo Media Processing (MPS) は、Alibaba Cloud独自の暗号化とHTTPライブストリーミング (HLS) 暗号化の2つの暗号化方法をサポートしています。 MPSコンソールで前者の方法を使用することを推奨します。 このトピックでは、HLS暗号化の仕組みと、API操作を呼び出してHLS暗号化を使用する方法について説明します。

動作

MPS uses the envelope encryption technology to encrypt videos. Alibaba Cloud Key Management Service (KMS) を使用して、データキー (DK) とエンベロープデータキー (EDK) を生成できます。 次に、DKを使用してビデオを暗号化し、暗号化されたビデオをEDKと一緒に保存できます。 ビデオを再生したい場合、プレーヤーは復号化サービスを使用してDKを取得し、それによってビデオを復号化します。

  • DKは、平文キーとも呼ばれる。 It is used for video encryption.
  • EDKは暗号文鍵とも呼ばれる。 エンベロープ暗号化技術を用いて暗号化された暗号文データ鍵である。 DKを解読し、平文データキーを取得するために使用されます。
  • HLS暗号化では、DKを保持する必要があります。
  1. MPS、Object Storage Service (OSS) 、Resource Access Management (RAM) 、KMS、Alibaba Cloud Content Delivery Network (CDN) の各サービスを有効化します。
    • OSSは、Alibaba Cloudが提供するデータストレージサービスです。 MPSのジョブのメディアファイルはOSSバケットに保存されます。

    • RAMは、Alibaba Cloudが提供するアクセス管理サービスです。 RAMを使用して、MPSにKMSアクセス権限を付与できます。

    • KMSは、Alibaba Cloudが提供するセキュリティ管理サービスです。 KMSを使用して、DKの生成、ファイルの暗号化、およびファイルの復号化を行うことができます。

    • Alibaba Cloud CDNは、Alibaba Cloudが提供するコンテンツ配信ネットワークです。 HLS暗号化の過程で、Alibaba Cloud CDNはM3U8ファイル内の復号化ユニフォームリソース識別子 (URI) を動的に変更し、復号化URIをプレーヤーに返します。

  2. MPSにKMSアクセス権限を付与します。
    これにより、MPSがKMSのGenerateDataKey操作を呼び出して、ビデオ暗号化中にDKとEDKを生成できるようになります。
  3. Configure a domain name for CDN for the OSS bucket that stores output files of MPS jobs. CNAMEレコードを追加し、CDNのドメイン名のオリジンホストを設定します。
  4. ビデオ暗号化のワークフローを作成し、出力ファイルを格納するOSSバケットやキーURIなどの情報を指定します。

    キーURIは、サービスのエンドポイントを指定します。 キーURIに関するデータは、ビデオ暗号化後にMPSによって生成されたM3U8ファイルに含まれています。

  5. 暗号化するビデオをアップロードし、作成したビデオのワークフローを指定します。
  6. ビデオがアップロードされると、MPSは自動的にワークフローをトリガーします。

    次に、MPSはGenerateDataKey操作を呼び出してDKとEDKを生成し、DKを使用してビデオを暗号化します。 ビデオが暗号化された後、MPSはキーURIとEDKに関するデータをM3U8ファイルに書き込みます。

  7. MPSは、出力ファイルを格納するOSSバケットにM3U8ファイルとTSファイルを格納します。
  1. Construct a token issuance service to generate the MtsHlsUriToken parameter.
    重要 トークン発行サービスは、MtsHlsUriTokenパラメーターの生成に使用されます。
  2. KMS解読操作を呼び出して解読サービスを構築し、DKをプレーヤーに返します。
    重要 KMS操作を呼び出してKMSからBase64-encoded DKを受信した後、Base64アルゴリズムを使用してDKをデコードし、デコードしたDKをプレーヤーに返す必要があります。
  3. Call the QueryMediaList operation of MPS to query the OSS URL of the M3U8 file, add the MtsHlsUriToken parameter to the OSS URL, and then return the OSS URL to the player.
  4. プレーヤーは、MtsHlsUriTokenパラメーターとDKを使用して、Alibaba Cloud CDNからビデオのストリーミングURLを要求します。 その後、Alibaba Cloud CDNはM3U8ファイルを変更し、キーURIとEDKをプレーヤーに返します。 Then, the player decrypts and plays the video.

コードロジック

In the procedures for HLS encryption and decryption, you must implement the following code logic:

  • ビデオ暗号化のワークフローを作成します。
    MPSコンソールでワークフローを作成できますが、サーバーSDKを使用してワークフローを作成することを推奨します。
  • Construct a token issuance service to generate the MtsHlsUriToken parameter, which is used as the decryption token. 復号化トークンの有効性を確認します。 各復号化トークンは1回だけ使用することを推奨します。
  • KMS復号化操作を呼び出して、復号化サービスを構築します。 Decode the DK by using the Base64 algorithm and return the decoded DK to the player.

準備

MPSでHLS暗号化を使用する前に、次の準備をしてください。

  1. MPS、OSS、KMS、RAM、Alibaba Cloud CDNなど、関連するAlibaba Cloudサービスを有効化します。
    これらのサービスを有効にしていない場合は、次の手順を実行します。
    1. MPSを有効にします。 For more information, see Activate MPS.
    2. OSS を有効化します。 詳細については、「OSS の有効化」をご参照ください。
    3. KMSを有効にします。 詳細については、「KMSの有効化」をご参照ください。
    4. Activate RAM and grant required permissions. 詳細については、「サブアカウントおよび権限付与の設定」をご参照ください。
    5. Alibaba Cloud CDNを有効化します。 詳細については、「CDN の有効化」をご参照ください。
  2. MPSにKMSアクセス権限を付与します。
    1. RAM コンソールにログインします。
    2. 左側のナビゲーションウィンドウで [承認する] をクリックします。 [付与] ページで、[付与権限] をクリックして新規権限ページに移動します。
    3. Enter AliyunMTSDefaultRole in the Principal search box. システムによって作成され、MPSで使用できるロールを選択します。
    4. [ポリシーの選択] セクションの検索ボックスにKMSと入力します。 AliyunKMSFullAccessを選択し、[OK] をクリックします。
    次に、MPSにKMSにアクセスする権限が付与されます。 MPSがビデオ暗号化要求を受信した後、MPSはKMSオペレーションを呼び出してDKを取得することができる。
  3. 出力ファイルを格納するOSSバケットのCDNのドメイン名を設定し、CDNのドメイン名のオリジンホストを設定します。 詳細については、「Configure a domain name for CDN」をご参照ください。 CDNのドメイン名とオリジンホストが設定されている場合は、この手順をスキップします。
    You can enter the public domain name of the OSS bucket, such as exampleBucket****.oss-cn-hangzhou.aliyuncs.com. OSSコンソールでパブリックドメイン名を取得できます。 または、出力ファイルを保存し、同じAlibaba Cloudアカウント内でコンテンツ配信の高速化を必要とするOSSバケットを選択できます。 OSSバケットの内部ドメイン名はサポートされていません。

ビデオを暗号化する

ビデオを暗号化するには、次の操作を実行します。

  1. Create a workflow for video encryption.
    To create a workflow of this type, you must use an Alibaba Cloud SDK, and add MPS dependencies. 使用するプログラミング言語に基づいて、ワークフロー作成のサンプルコードを表示できます。 詳細については、下表をご参照ください。
    重要 ワークフローを作成するときは、キーURIを指定する必要があります。 During video encryption, MPS writes the key URI to the M3U8 file and stores the file in the OSS bucket that stores output files. キーURIの例は、example.aliyundoc.comである。
    プログラミング言語 SDK サンプルコード
    Java SDK for Java HLS暗号化のワークフローを作成する
    Python SDK for Python HLS暗号化のワークフローを作成する
    PHP SDK for PHP HLS暗号化のワークフローを作成する
  2. Upload a video to trigger the workflow. MPSコンソールまたはOSSコンソールを使用してビデオをアップロードできます。 詳細については、「ビデオファイルのアップロードとワークフローの実行」をご参照ください。
    アップロード設定で作成したビデオのワークフローを指定した場合、ビデオがアップロードされた後、MPSは自動的にワークフローをトリガーします。
    After the video is encrypted, log on to the OSS console and view the M3U8 file in the OSS bucket that stores output files. The following code provides an example of the M3U8 file:
    #EXTM3U
         #EXT-X-VERSION:3
         #EXT-X-TARGETDURATION:5
         #EXT-X-MEDIA-SEQUENCE:0
         # EXT-X-KEY: 方法=AES-128、URI="https://example.aliyundoc.com? 暗号文=aabbccddeeff&MediaId=fbbf98691ea44b7c82dd75c5bc8b ****"
         #EXTINF:4.127544,
         15029611683170-00001.ts
         #EXT-X-ENDLIST

    In this example, the key URI you configure and the EDK are contained in the URI field.

HLS暗号化ビデオを再生する

HLS暗号化ビデオを再生するには、次の操作を実行します。

  1. トークン発行サービスを構築します。
    高いセキュリティレベルを確保するために、暗号化方式に基づいてトークン発行サービスを構築する必要があります。
  2. 復号化サービスを構築します。
    ビデオを復号化し、復号化キーを取得するためのローカルHTTPサービスを構築します。 次のサンプルコードは、JavaおよびPythonで復号化サービスを構築する方法の例を示しています。
    • Javaのサンプルコード

      SDK for Javaに必要な依存関係:

      Javaのサンプルコード:

      
      パッケージcom.aliyun.smallcode;
      com.aliyuncs.DefaultAcsClientをインポートします。com.aliyuncs.exceptions.ClientExceptionをインポートします。com.aliyuncs.http.ProtocolTypeをインポートします。com.aliyuncs.kms.mo del.v20160120.DecryptRequestをインポートします。com.aliyuncs.kms.mo del.v20160120.DecryptResponseをインポートします。com.aliyuncs.profile.DefaultProfileをインポートします。impor t com.sun.net.httpserver.Headers;
      impor t com.sun.net.httpserver.HttpExchange;
      impor t com.sun.net.httpserver.HttpHandler;
      impor t com.sun.net.httpserver.HttpServer;
      impor t com.sun.net.httpserver.spi.HttpServerProvider;
      impor t org.apache.com mons.codec.binary.Base64;
      java.io.IOExceptionをインポートします。java.io.OutputStreamをインポートします。impor t java.net.HttpURLConnection;
      impor t java.net.InetSocketAddress;
      impor t java.net.URI;
      java.util.regex.Matcherをインポートします。java.util.regex.Patternをインポートします。public class AuthorizationServer {
      プライベート静的DefaultAcsClientクライアント。static {
      文字列region = "";
      文字列accessKeyId = "";
      文字列accessKeySecret = "";
      client = new DefaultAcsClient(DefaultProfile.getProfile(region, accessKeyId, accessKeySecret));
      }
      public class AuthorizationHandlerがHttpHandlerを実装 {
      パブリックvoidハンドル (HttpExchange httpExchange) がIOException {
      文字列requestMethod = httpExchange.getRequestMethod();
      if(requestMethod.equalsIgnoreCase("GET")){
      // ビデオURLからEDKを取得します。
      文字列暗号文=getCiphertext(httpExchange);
      if (null ==暗号文)
      戻ります。// KMSから取得したDKを復号し、Base64アルゴリズムを使用してDKを復号します。
      byte[] key = decrypt (暗号文);
      // ヘッダーを設定します。
      setHeader(httpExchange、キー);
      // デコードされたDKを返します。
      OutputStream responseBody = httpExchange.getResponseBody();
      responseBody.write (キー);
      responseBody.close();
      }
      }
      private void setHeader(HttpExchange httpExchange、バイト [] キー) がIOException {
      Headers responseHeaders = httpExchange.getResponseHeaders();
      responseHeaders.set("Access-Control-Allow-Origin" 、"*");
      httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK、key.length);
      }
      private byte[] decrypt(String ciphertext) {
      DecryptRequest request = new DecryptRequest();
      request.setCiphertextBlob (暗号文);
      request.setProtocol(ProtocolType.HTTPS);
      try {
      DecryptResponse response = client.getAcsResponse (リクエスト);
      文字列プレーンテキスト=response.getPlaintext();
      // 注: Base64アルゴリズムを使用してDKをデコードする必要があります。
      Base64.decodeBase64 (プレーンテキスト) を返します。} catch (ClientException e) {
      e.printStackTrace();
      nullを返します。}
      }
      プライベート文字列getCiphertext(HttpExchange httpExchange) {
      URI uri = httpExchange.getRequestURI();
      文字列queryString = uri.getQuery();
      文字列パターン="Ciphertext=(\\w *)";
      パターンr = Pattern.comパイル (パターン);
      マッチャーm = r. Matcher (queryString);
      if (m.find())
      戻りm。グループ (1);
      else {
      System.out.println("Not Found Ciphertext");
      nullを返します。}
      }
      }
      private void startService() がIOException {
      HttpServerProvider=HttpServerProvider.provider();
      // 一度に10個のリクエストを受け入れることができるポート8888でリスナーを設定します。
      HttpServer httpserver = provider.createHttpServer (新しいInetSocketAddress(8888) 、10);
      httpserver.createContext("/", new AuthorizationHandler());
      httpserver.start();
      System.out.println("server started");
      }
      public static void main(String[] args) throws IOException {
      AuthorizationServer server = new AuthorizationServer();
      server.startService();
      }
      }
    • Sample code in Python
      SDK for Pythonに必要な依存関係:
      • pip install aliyun-python-sdk-core
      • pip install aliyun-python-sdk-kms
      • pip install aliyun-python-sdk-mts
      Pythonのサンプルコード:
      
      # -*-コーディング: UTF-8 -*-
      BaseHTTPServerインポートからBaseHTTPRequestHandler
      aliyunsdkcore.clientインポートからAcsClient
      aliyunsdkkms.request.v20160120からのインポートDecryptRequest
      インポートcgi
      jsonのインポート
      インポートbase64
      urlparseのインポート
      client = AcsClient("" 、"" 、"");
      クラスAuthorizationHandler(BaseHTTPRequestHandler):
      def do_GET(self):
      self.check()
      self.set_header()
      cipertext = self.get_cihpertext()
      プレーンテキスト=self.de crypt_cihpertext(cipertext)
      プレーンテキストを印刷する
      key = base64.b64decode (プレーンテキスト)
      印刷キー
      self.wfile.write (キー)
      def do_POST(self):
      パス
      defチェック (自己):
      # MtsHlsUriTokenなどをチェックします。パス
      def set_header(self):
      self.send_response(200)
      # cors
      self.send_header('Access-Control-Allow-Origin', '*')
      self.end_headers()
      def get_cihpertext(self):
      path = urlparse.urlparse(self.path)
      query = urlparse.parse_qs(path.query)
      return query.get('Ciphertext')[0]
      def decrypt_cihpertext(self, cipertext):
      request = DecryptRequest.DecryptRequest()
      request.set_CiphertextBlob(cipertext)
      response = client.do_action_with_exception (リクエスト)
      jsonResp = json.loads (レスポンス)
      リターンjsonResp["平文"]
      if __name__ ='__main__':
      # シンプルなサーバーを起動し、永久にループします
      BaseHTTPServerからHTTPServerをインポート
      print「サーバーの起動、停止に使用」
      server = HTTPServer(('127.0.0.1 ', 8888), AuthorizationHandler)
      server.serve_forever()
  3. MPSのQueryMediaList操作を呼び出して、ビデオのストリーミングURLを照会します。
    OpenAPI Explorerで、またはSDKを統合して操作を呼び出すことができます。
  4. 暗号化されたビデオを再生します。
    ApsaraVideo Playerまたはサードパーティのプレーヤーを使用して、暗号化されたビデオを再生できます。
    • サードパーティのプレーヤーを使用する場合は、再生ロジックを指定します。
    • ApsaraVideo Playerを使用している場合は、再生前に必要に応じてセキュリティトークンと認証情報を取得してください。 詳細については、「ビデオを再生する」をご参照ください。
    オンラインプレーヤーを使用して、HLS暗号化によって暗号化されたビデオの再生をテストすることもできます。
    たとえば、ApsaraVideo Player診断ツールを使用できます。 このツールを使用する場合、[ソース] フィールドにビデオのストリーミングURLを入力し、[再生] をクリックします。
    ブラウザのデバッグページで、プレーヤーが認証サーバーにリクエストを送信し、復号化キーを取得してから、ビデオを復号化して再生していることがわかります。

    次の手順では、ApsaraVideo Playerが再生をテストする方法について説明します。

    • ApsaraVideo PlayerがストリーミングURLを受信すると、OSSバケットのドメイン名がCDNのドメイン名に置き換えられます。 次に、ApsaraVideo Playerは、復号化トークンとして使用されるMtsHlsUriTokenパラメーターをCDNのドメイン名に追加し、変更されたストリーミングURLのリクエストをAlibaba Cloud CDNに送信します。 サンプルリクエスト: https://example.aliyundoc.com/test_01.m3u8?MediaId=fbbf98691ea44b7c82dd75c5bc8b ****&MtsHlsUriToken=<トークン>
      重要

      ApsaraVideo Playerを使用すると、MtsHlsUriTokenパラメーターが自動的に追加されます。 If you use other players, you must manually add the MtsHlsUriToken parameter.

    • Alibaba Cloud CDNはリクエストを受信すると、M3U8ファイルのキーURIを動的に変更し、変更したストリーミングURLをプレーヤーに返します。 たとえば、元のストリーミングURLがhttps://example.aliyundoc.com?Ciphertext=aabbccddeeff&MediaId=fbbf98691ea44b7c82dd75c5bc8b **** の場合、返されるストリーミングURLはhttps://example.aliyundoc.com?Ciphertext=aabbccddeeff&MediaId=fbbf98691ea44b7c82dd75c5bc8b ****&MtsHlsUriToken=<Token> です。

    • The player parses and accesses the URI in the EXT-X-KEY tag of the M3U8 file to obtain the decryption key. KMSのDecrypt操作を呼び出し、得られたDKをBase64アルゴリズムを使用してデコードし、デコードしたDKをプレーヤーに返します。 プレーヤーはDKを使用してTSファイルを復号化し、ビデオを再生します。