すべてのプロダクト
Search
ドキュメントセンター

ApsaraVideo VOD:HLS暗号化

最終更新日:Oct 24, 2024

HTTPライブストリーミング (HLS) 暗号化は、AES-128を使用してビデオコンテンツを暗号化し、すべてのHLS互換プレーヤーをサポートします。 HLS暗号化は、Key Management Service (KMS) およびトークンサービスとともに使用する必要があります。 この暗号化方式は、オンライン教育やテレビ番組など、高いセキュリティが要求される分野で広く利用されています。このトピックでは、HLS暗号化を使用してHLS暗号化ビデオを再生する方法について説明します。

アップグレードの説明

ApsaraVideo VODのHLS暗号化機能は2022年8月にアップグレードされました。 古い暗号化手順は引き続き使用できますが、暗号化プロセスとロジックが改善された新しい手順を使用することをお勧めします。 古い暗号化手順を使用する場合は、「HLS暗号化」をご参照ください。

HLS暗号化のしくみ

ApsaraVideo VODは、エンベロープ暗号化テクノロジーを使用してビデオを暗号化します。 KMSを使用して、データキー (DK) とエンベロープデータキー (EDK) を生成できます。 次に、DKを使用してビデオを暗号化し、暗号化されたビデオをEDKと一緒に保存できます。 ビデオを再生する場合、プレーヤーは復号化サービスを使用してDKを取得し、ビデオを復号化します。

復号用のURLを検証する場合は、M3U8の暗号化と書き換えを有効にして、HLSコンテンツを保護できます。 デフォルトでは、MtsHlsUriTokenは書き換えられます。 M3U8の暗号化と書き換えを有効にする方法と技術原則の詳細については、「M3U8の暗号化と書き換え」をご参照ください。

暗号化と復号化プロセス

アップロードと暗号化 视频安全-HLS标准加密3

解読と再生

(推奨) M3U8暗号化と書き換えが有効

视频安全-HLS标准加密6..png

M3U8暗号化と書き換えが有効になっていません

视频安全-HLS标准加密2

条件

期間

説明

RAM

RAM (Resource Access Management) は、Alibaba Cloudが提供するサービスです。 ユーザーIDとリソースアクセス権限を管理できます。 詳細については、「RAM の概要」をご参照ください。

KMS

Key Management Service (KMS) は、キー管理、データ暗号化、およびシークレット管理のためのエンドツーエンドのサービスプラットフォームです。 KMSは、シンプルで信頼性が高く、安全で、標準に準拠した機能を提供し、データを暗号化および保護し、シークレットを管理します。 詳細については、「キー管理サービスとは」をご参照ください。

DK

データキー (DK) は、データの暗号化に使用される平文キーです。 詳細については、「用語」をご参照ください。

EDK

エンベロープデータ鍵または暗号化データ鍵 (EDK) は、エンベロープ暗号化を用いて生成される暗号文データ鍵である。 詳細については、「用語」をご参照ください。

前提条件

  • ApsaraVideo VODが有効化されています。 詳細については、「ApsaraVideo VODの有効化」をご参照ください。

  • ApsaraVideo VODはKMSへのアクセスを許可されています。 [クラウドリソースアクセス許可] ページで、ApsaraVideo VODにKMSへのアクセスを許可できます。

  • 高速化ドメイン名がApsaraVideo VODに追加されました。 詳細については、「CDNのドメイン名の追加」をご参照ください。

  • ApsaraVideo VOD SDKは統合されています。 詳細については、「概要」をご参照ください。 このトピックでは、例としてApsaraVideo VOD SDK for Javaを使用します。

ビデオを暗号化

  1. サービスキーを作成します。

    サービスキーは、KMSのプライマリ暗号化キーとして使用されます。 HLS暗号化用のキーを生成するには、サービスキーを作成する必要があります。 サービスキーを作成しない場合、GenerateKMSDataKey操作を呼び出してDKを生成するとエラーが発生します。

    1. ApsaraVideo VODコンソールにログインします。 左側のナビゲーションウィンドウで、[構成管理]> [メディア処理]> [HLS暗号化] を選択します。

    2. ページの左上隅で、サービスキーを作成するリージョンを選択します。

      説明

      サービスキーは、ビデオが保存されているオリジンサーバーと同じリージョンに作成する必要があります。 たとえば、ビデオが中国 (上海) リージョンに保存されている場合は、中国 (上海) リージョンにサービスキーを作成する必要があります。

      标准加密-服务地域

    3. HLS暗号化ページで、[サービスキーの作成] をクリックします。

      サービスキーの作成後、システムはサービスキーが作成されます。 [キー情報] セクションでサービスキーを確認できます。

      説明

      [キー情報] セクションにサービスキーが表示されない場合は、AliyunVODDefaultRoleポリシーをロールにアタッチしているかどうかを確認します。 [Cloud Resource Access Authorization] ページでロールに権限を付与し、HLS Encryptionページを更新してサービスキーを表示できます。

  2. HLS暗号化用のトランスコードテンプレートグループを作成します。

    HLS暗号化用のトランスコードなしテンプレートグループとトランスコードテンプレートグループが必要です。

    [No Transcoding] テンプレートグループは、プリセットテンプレートグループです。 HLS暗号化用のトランスコードテンプレートグループを作成する必要があります。 トランスコードテンプレートグループを作成するには、次の手順を実行します。

    1. ApsaraVideo VODコンソールにログインします。 左側のナビゲーションウィンドウで、[構成管理]> [メディア処理]> [トランスコードテンプレートグループ] を選択します。

    2. [トランスコードテンプレートグループ] ページで、[トランスコードテンプレートグループの作成] をクリックします。

      [基本パラメーター] セクションで、カプセル化形式hlsに設定します。 [詳細パラメーター] セクションで、[ビデオ暗号化] をオンにし、[Alibaba Cloud独自の暗号化] を選択します。 ビジネス要件に基づいて他のパラメーターを設定します。 パラメーターの詳細については、「通常のトランスコードテンプレートグループの設定」をご参照ください。视频安全-HLS加密-控制台

    3. テンプレートが作成されたら、[トランスコードテンプレートグループ] ページでトランスコードテンプレートグループのIDを確認します。 IDは、HLS暗号化をリクエストするときに必要です。视频安全-HLS加密-控制台1

  3. Alibaba Cloud KMSをカプセル化するキー管理サービスを設定します。

    DKとEDKを生成するには、GenerateKMSDataKey操作を呼び出します。

    GenerateKMSDataKeyを呼び出すときにリクエストパラメーターを指定する必要はありません。 応答のCiphertextBlobパラメーターはEDKを示し、PlaintextはDKを示します。 CiphertextBlobはAES_128キーです。 EDKは、HLS暗号化をリクエストするときに必要です。

  4. [トランスコードなし] トランスコードテンプレートグループを使用して動画をアップロードします。

    通常、自動トランスコーディングは、ApsaraVideo VODにアップロードされたビデオに対してトリガーされます。 ただし、HLS暗号化は、自動的にトランスコードされるビデオをサポートしません。 したがって、HLS暗号化が必要な動画をアップロードするには、[No Transcoding] テンプレートグループを使用する必要があります。 このように、自動トランスコーディングはトリガーされません。

    1. ApsaraVideo VODコンソールを使用してメディアファイルをアップロードする方法の詳細については、「ApsaraVideo VODコンソールを使用してメディアファイルをアップロードする」をご参照ください。 ApsaraVideo VOD APIを使用してメディアファイルをアップロードする方法の詳細については、「メディアアップロード」をご参照ください。

    2. ApsaraVideo VODでイベント通知を設定します。 FileUploadCompleteコールバックが返されると、ビデオがアップロードされます。 イベント通知の設定方法の詳細については、「概要」をご参照ください。

  5. HLS暗号化を開始します。

    1. SubmitTranscodeJobs操作を呼び出して、HLS暗号化を開始します。

      Javaでサンプルコードを表示する

      次の表に、ビジネス要件に基づいて変更できるサンプルコードのパラメーターを示します。

      パラメーター

      説明

      request.setTemplateGroupId("")

      手順2で作成したトランスコードテンプレートグループのID。

      request.setVideoId("")

      ステップ4でアップロードしたビデオのID。

      encryptConfig.put("CipherText","")

      ステップ3で返されたCiphertextBlobの値。

      encryptConfig.put("DecryptKeyUri","")

      キーURI。 URIは、復号化サービスのIPアドレスとCiphertextBlobの値で構成されます。 ローカルポート8099が使用されている場合、キーURIは次のとおりです。

      http:// 172.16.0.1:8099?CipherText=CiphertextBlobの値

      import com.alibaba.fastjson.JSON;
      import com.alibaba.fastjson.JSONObject;
      import com.aliyuncs.DefaultAcsClient;
      import com.aliyuncs.exceptions.ClientException;
      import com.aliyuncs.profile.DefaultProfile;
      import com.aliyuncs.vod.model.v20170321.SubmitTranscodeJobsRequest;
      import com.aliyuncs.vod.model.v20170321.SubmitTranscodeJobsResponse;
      
      public class SubmitTranscodeJobs {
      
          // The AccessKey pair of an Alibaba Cloud account has access permissions on all API operations. We recommend that you use the AccessKey pair of a RAM user to call API operations or perform routine O&M. 
          // We recommend that you not include your AccessKey pair (AccessKey ID and AccessKey secret) in your project code. Otherwise, the AccessKey pair may be leaked and the security of all resources within your account may be compromised. 
          // In this example, ApsaraVideo VOD reads the AccessKey pair from the environment variables to implement identity verification for API access. Before you run the sample code, configure the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET. 
          private static String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
          private static String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
      
          public static SubmitTranscodeJobsResponse submitTranscodeJobs(DefaultAcsClient client) throws Exception{
              SubmitTranscodeJobsRequest request = new SubmitTranscodeJobsRequest();
              request.setTemplateGroupId("");
              request.setVideoId("");
              JSONObject encryptConfig = new JSONObject();
              encryptConfig.put("CipherText","");
              encryptConfig.put("DecryptKeyUri","");
              encryptConfig.put("KeyServiceType","KMS");
              request.setEncryptConfig(encryptConfig.toJSONString());
              return client.getAcsResponse(request);
          }
      
          public static void main(String[] args) throws ClientException {
              String regionId = "cn-shanghai";  // Specify the region where ApsaraVideo VOD is activated.
              DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
              DefaultAcsClient client = new DefaultAcsClient(profile);
      
              SubmitTranscodeJobsResponse response;
              try {
                  response = submitTranscodeJobs(client);
                  System.out.println("RequestId is:"+response.getRequestId());
                  System.out.println("TranscodeTaskId is:"+response.getTranscodeTaskId());
                  System.out.println("TranscodeJobs is:"+ JSON.toJSON(response.getTranscodeJobs()));
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      }       
    2. ApsaraVideo VODでイベント通知を設定した場合、StreamTranscodeCompleteまたはTranscodeCompleteコールバックが返されると、ビデオはトランスコードされます。

  6. HLS暗号化の結果を表示します。

    ビデオをトランスコードしたら、次のいずれかの方法でHLS暗号化が成功したかどうかを確認します。

    • 方法1: ApsaraVideo VODコンソールにログインします。 左側のナビゲーションウィンドウで、[メディアファイル]> [オーディオ /ビデオ] を選択します。 [ビデオとオーディオ] ページでビデオを見つけ、[操作] 列の [管理] をクリックします。 [ビデオURL] タブで、MP4を含む形式のビデオ出力が存在し、M3U8ファイルにHLS暗号化がタグ付けされている場合、HLS暗号化は成功します。视频安全-HLS标准加密5

    • 方法2: HLS暗号化とタグ付けされたM3U8ファイルのURLをコピーし、curl -v "URL of the M3U8 file" コマンドを実行して、結果を確認します。 HLS暗号化の開始時に指定した復号化URLがDecryptKeyUriの値と同じである場合、HLS暗号化は成功です。

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

  1. 復号化サービスを設定します。

    ビデオを復号化するためのローカルHTTPサービスを設定します。

    DecryptKMSDataKey操作を呼び出して、ビデオを復号化します。 DKは応答で返されます。 DKは、GenerateKMSDataKey操作の応答で返されるPlainTextパラメーターのBase64-decoded値です。

    復号用のURLを検証する場合は、M3U8の暗号化と書き換えを有効にして、HLSコンテンツを保護できます。 デフォルトでは、MtsHlsUriTokenは書き換えられます。 M3U8の暗号化と書き換えを有効にする方法と技術原則の詳細については、「M3U8の暗号化と書き換え」をご参照ください。 復号化サービスの設定に使用されるコードは、M3U8の暗号化と書き換えを有効にしたかどうかによって異なります。 次のセクションでは、サンプルコードについて説明します。

    • (推奨) M3U8暗号化および書き換え可能

      Javaでサンプルコードを表示する

      Javaの次のサンプルコードは参照用です。 ビジネス要件に基づいて、復号化およびMtsHlsUriToken検証のロジックを開発できます。 次の表に、ビジネス要件に基づいて変更できるサンプルコードのパラメーターを示します。

      パラメーター

      説明

      region

      リージョン ID です。 KMSとApsaraVideo VODは同じリージョンで有効化する必要があります。 たとえば、中国 (上海) リージョンでKMSとApsaraVideo VODを有効にする場合、このパラメーターにcn-Shanghaiを指定します。 他のリージョンのIDの詳細については、「ApsaraVideo VODのリージョンID」をご参照ください。

      AccessKey

      Alibaba CloudアカウントまたはRAMユーザーのAccessKey IDとAccessKeyシークレット。 AccessKeyペアを取得する方法の詳細については、「AccessKeyペアの取得」をご参照ください。

      httpserver

      サービスの有効化に使用するポート番号。

      import com.aliyuncs.DefaultAcsClient;
      import com.aliyuncs.exceptions.ClientException;
      import com.aliyuncs.http.ProtocolType;
      import com.aliyuncs.vod.model.v20170321.DecryptKMSDataKeyRequest;
      import com.aliyuncs.vod.model.v20170321.DecryptKMSDataKeyResponse;
      import com.aliyuncs.profile.DefaultProfile;
      import com.sun.net.httpserver.Headers;
      import com.sun.net.httpserver.HttpExchange;
      import com.sun.net.httpserver.HttpHandler;
      import com.sun.net.httpserver.HttpServer;
      import com.sun.net.httpserver.spi.HttpServerProvider;
      import org.apache.commons.codec.binary.Base64;
      import java.io.IOException;
      import java.io.OutputStream;
      import java.net.HttpURLConnection;
      import java.net.InetSocketAddress;
      import java.net.URI;import java.util.regex.Matcher;
      import java.util.regex.Pattern;
      public class HlsDecryptServer {
          private static DefaultAcsClient client;
          static {
              // The region where KMS is used. The region must be the same as the region where the video resides.
              String region = "";
              // The AccessKey pair that is used to authorize access to KMS.
              // The AccessKey pair of an Alibaba Cloud account has access permissions on all API operations. We recommend that you use the AccessKey pair of a RAM user to call API operations or perform routine O&M. 
              // We recommend that you not include your AccessKey pair (AccessKey ID and AccessKey secret) in your project code. Otherwise, the AccessKey pair may be leaked and the security of all resources within your account may be compromised. 
              // In this example, ApsaraVideo VOD reads the AccessKey pair from the environment variables to implement identity verification for API access. Before you run the sample code, configure the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET. 
              String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
              String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
              client = new DefaultAcsClient(DefaultProfile.getProfile(region, accessKeyId, accessKeySecret));
          }
          /**
           * Note:
           * 1. Receive a decryption request and obtain the EDK and token.
           * 2. Call the decryption operation of KMS to obtain the plaintext key.
           * 3. Decode the DK by using the Base64 algorithm and return the DK.
           */
          public class HlsDecryptHandler implements HttpHandler {
              /**
               * Process the decryption request.
               * @param httpExchange
               * @throws IOException
               */
              public void handle(HttpExchange httpExchange) throws IOException {
                  String requestMethod = httpExchange.getRequestMethod();
                  if ("GET".equalsIgnoreCase(requestMethod)) {
                      // Check whether the token is valid.
                      String token = getMtsHlsUriToken(httpExchange);
                      boolean validRe = validateToken(token);
                      if (!validRe) {
                          return;
                      }
                      // Obtain the ciphertext key from the video URL.
                      String ciphertext = getCiphertext(httpExchange);
                      if (null == ciphertext)
                          return;
                      // Decrypt the key in KMS and decode the key by using the Base64 algorithm.
                      byte[] key = decrypt(ciphertext);
                      // Configure the header.
                      setHeader(httpExchange, key);
                      // Return the key decoded by using the Base64 algorithm.
                      OutputStream responseBody = httpExchange.getResponseBody();
                      responseBody.write(key);
                      responseBody.close();
                  }
              }
              private void setHeader(HttpExchange httpExchange, byte[] key) throws IOException {
                  Headers responseHeaders = httpExchange.getResponseHeaders();
                  responseHeaders.set("Access-Control-Allow-Origin", "*");
                  httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, key.length);
              }
              /**
               * Call the decryption operation of KMS to decrypt the key and decode the key by using the Base64 algorithm.
               * @param ciphertext
               * @return
               */
              private byte[] decrypt(String ciphertext) {
                  DecryptKMSDataKeyRequest request = new DecryptKMSDataKeyRequest();
                  request.setCipherText(ciphertext);
                  request.setProtocol(ProtocolType.HTTPS);
                  try {
                      DecryptKMSDataKeyResponse response = client.getAcsResponse(request);
                      String plaintext = response.getPlaintext();
                      System.out.println("PlainText: " + plaintext);
                      // Note: You must decode the DK by using the Base64 algorithm.
                      return Base64.decodeBase64(plaintext);
                  } catch (ClientException e) {
                      e.printStackTrace();
                      return null;
                  }
              }
              /**
               * Check whether the token is valid.
               * @param token
               * @return
               */
              private boolean validateToken(String token) {
                  if (null == token || "".equals(token)) {
                      return false;
                  }
                  // TODO. You can customize the logic to check whether the token is valid.
                  return true;
              }
              /**
               * Obtain the ciphertext key from the video URL.
               * @param httpExchange
               * @return
               */
              private String getCiphertext(HttpExchange httpExchange) {
                  URI uri = httpExchange.getRequestURI();
                  String queryString = uri.getQuery();
                  String pattern = "CipherText=(\\w*)";
                  Pattern r = Pattern.compile(pattern);
                  Matcher m = r.matcher(queryString);
                  if (m.find())
                      return m.group(1);
                  else {
                      System.out.println("Not Found CipherText Param");
                      return null;
                  }
              }
              /**
               * Obtain the value of the token parameter.
               *
               * @param httpExchange
               * @return
               */
              private String getMtsHlsUriToken(HttpExchange httpExchange) {
                  URI uri = httpExchange.getRequestURI();
                  String queryString = uri.getQuery();
                  String pattern = "MtsHlsUriToken=(\\w*)";
                  Pattern r = Pattern.compile(pattern);
                  Matcher m = r.matcher(queryString);
                  if (m.find())
                      return m.group(1);
                  else {
                      System.out.println("Not Found MtsHlsUriToken Param");
                      return null;
                  }
              }
          }
          /**
           * Start the service.
           *
           * @throws IOException
           */
          private void serviceBootStrap() throws IOException {
              HttpServerProvider provider = HttpServerProvider.provider();
              // You can specify a custom port for listening. A web server can handle a maximum of 30 requests simultaneously on the same port.
              HttpServer httpserver = provider.createHttpServer(new InetSocketAddress(8099), 30);
              httpserver.createContext("/", new HlsDecryptHandler());
              httpserver.start();
              System.out.println("hls decrypt server started");
          }
          public static void main(String[] args) throws IOException {
              HlsDecryptServer server = new HlsDecryptServer();
              server.serviceBootStrap();
          }}
    • M3U8暗号化および書き換えが有効になっていない

      Javaでサンプルコードを表示する

      次の表に、ビジネス要件に基づいて変更できるサンプルコードのパラメーターを示します。

      パラメーター

      説明

      region

      リージョン ID です。 KMSとApsaraVideo VODは同じリージョンで有効化する必要があります。 たとえば、中国 (上海) リージョンでKMSとApsaraVideo VODを有効にする場合、このパラメーターにcn-Shanghaiを指定します。 他のリージョンのIDの詳細については、「ApsaraVideo VODのリージョンID」をご参照ください。

      AccessKey

      Alibaba CloudアカウントまたはRAMユーザーのAccessKey IDとAccessKeyシークレット。 AccessKeyペアを取得する方法の詳細については、「AccessKeyペアの取得」をご参照ください。

      httpserver

      サービスの有効化に使用するポート番号。

      import com.aliyuncs.DefaultAcsClient;
      import com.aliyuncs.exceptions.ClientException;
      import com.aliyuncs.http.ProtocolType;
      import com.aliyuncs.profile.DefaultProfile;
      import com.aliyuncs.vod.model.v20170321.DecryptKMSDataKeyRequest;
      import com.aliyuncs.vod.model.v20170321.DecryptKMSDataKeyResponse;
      import com.sun.net.httpserver.Headers;
      import com.sun.net.httpserver.HttpExchange;
      import com.sun.net.httpserver.HttpHandler;
      import com.sun.net.httpserver.HttpServer;
      import com.sun.net.httpserver.spi.HttpServerProvider;
      import org.apache.commons.codec.binary.Base64;
      
      import java.io.IOException;
      import java.io.OutputStream;
      import java.net.HttpURLConnection;
      import java.net.InetSocketAddress;
      import java.net.URI;
      import java.util.regex.Matcher;
      import java.util.regex.Pattern;
      
      public class HlsDecryptServerNoToken {
      
          private static DefaultAcsClient client;
          static {
              // The region where KMS is used. The region must be the same as the region where the video resides.
              String region = "cn-beijing";
              // The AccessKey pair that is used to authorize access to KMS.
              // The AccessKey pair of an Alibaba Cloud account has access permissions on all API operations. We recommend that you use the AccessKey pair of a RAM user to call API operations or perform routine O&M. 
              // We recommend that you not include your AccessKey pair (AccessKey ID and AccessKey secret) in your project code. Otherwise, the AccessKey pair may be leaked and the security of all resources within your account may be compromised. 
              // In this example, ApsaraVideo VOD reads the AccessKey pair from the environment variables to implement identity verification for API access. Before you run the sample code, configure the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET. 
              String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
              String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
              client = new DefaultAcsClient(DefaultProfile.getProfile(region, accessKeyId, accessKeySecret));
          }
          /**
           * Note:
           * 1. Receive a decryption request and obtain the ciphertext key and token.
           * 2. Call the decryption operation of KMS to obtain the plaintext key.
           * 3. Decode the plaintext key by using the Base64 algorithm and return the decoded key.
           */
          public class HlsDecryptHandler implements HttpHandler {
              /**
               * Process the decryption request.
               * @param httpExchange
               * @throws IOException
               */
              public void handle(HttpExchange httpExchange) throws IOException {
                  String requestMethod = httpExchange.getRequestMethod();
                  if ("GET".equalsIgnoreCase(requestMethod)) {
      
                      // Obtain the ciphertext key from the video URL.
                      String ciphertext = getCiphertext(httpExchange);
                      System.out.println(ciphertext);
                      if (null == ciphertext)
                          return;
                      // Decrypt the key in KMS and decode the key by using the Base64 algorithm.
                      byte[] key = decrypt(ciphertext);
                      // Configure the header.
                      setHeader(httpExchange, key);
                      // Return the key that is decoded by using the Base64 algorithm.
                      OutputStream responseBody = httpExchange.getResponseBody();
                      responseBody.write(key);
                      responseBody.close();
                  }
              }
              private void setHeader(HttpExchange httpExchange, byte[] key) throws IOException {
                  Headers responseHeaders = httpExchange.getResponseHeaders();
                  responseHeaders.set("Access-Control-Allow-Origin", "*");
                  httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, key.length);
              }
              /**
               * Call the decryption operation of KMS to decrypt the key and decode the plaintext key by using the Base64 algorithm.
               * @param ciphertext
               * @return
               */
              private byte[] decrypt(String ciphertext) {
      
                  DecryptKMSDataKeyRequest request = new DecryptKMSDataKeyRequest();
                  request.setCipherText(ciphertext);
                  request.setProtocol(ProtocolType.HTTPS);
                  try {
                      DecryptKMSDataKeyResponse response = client.getAcsResponse(request);
                      String plaintext = response.getPlaintext();
                      System.out.println("PlainText: " + plaintext);
                      // Note: You must decode the key by using the Base64 algorithm.
                      return Base64.decodeBase64(plaintext);
                  } catch (ClientException e) {
                      e.printStackTrace();
                      return null;
                  }
              }
      
              /**
               * Obtain the ciphertext key from the video URL.
               * @param httpExchange
               * @return
               */
              private String getCiphertext(HttpExchange httpExchange) {
                  URI uri = httpExchange.getRequestURI();
                  String queryString = uri.getQuery();
                  String pattern = "CipherText=(\\w*)";
                  Pattern r = Pattern.compile(pattern);
                  Matcher m = r.matcher(queryString);
                  if (m.find())
                      return m.group(1);
                  else {
                      System.out.println("Not Found CipherText Param");
                      return null;
                  }
              }
          }
      
          /**
           * Start the service.
           *
           * @throws IOException
           */
          private void serviceBootStrap() throws IOException {
              HttpServerProvider provider = HttpServerProvider.provider();
              // You can specify a custom port for listening. A web server can handle a maximum of 30 requests simultaneously on the same port.
              HttpServer httpserver = provider.createHttpServer(new InetSocketAddress(8099), 30);
              httpserver.createContext("/", new HlsDecryptHandler());
              httpserver.start();
              System.out.println("hls decrypt server started");
          }
          public static void main(String[] args) throws IOException {
              HlsDecryptServerNoToken server = new HlsDecryptServerNoToken();
              server.serviceBootStrap();
          }}
      
  2. ビデオの再生URLと資格情報を取得します。

    GetVideoPlayAuth操作を呼び出して再生資格情報を取得し、GetPlayInfo操作を呼び出して再生URLを取得します。

  3. 暗号化されたビデオを再生します。

    HLS暗号化は、すべてのHLS互換プレーヤーをサポートします。 自己開発プレーヤーまたはApsaraVideoプレーヤーを使用して、暗号化されたビデオを再生できます。

    ApsaraVideo Playerを使用して暗号化されたビデオを再生する場合、トークンと認証情報を取得する必要があります。 詳細については、「暗号化ビデオの再生」をご参照ください。 サードパーティのプレーヤーを使用する場合は、再生ロジックを指定します。

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

    (推奨) M3U8暗号化および書き換え可能

    プロセス

    • プレーヤーは、M3U8ファイルのURIを取得した後、M3U8ファイルのEXT-X-KEYタグ内のURIを解析してアクセスします。 このようにして、プレーヤは、EDKを含む復号化操作のURIを取得する。 このURIは、HLS暗号化の開始時に指定するEncryptConfigDecryptKeyUriパラメーターの値です。

    • 許可されたユーザーのみにビデオへのアクセスを許可する場合、プレーヤーは、プレーヤーが復号鍵を取得したときに確認できる正確な認証情報を提供する必要があります。 認証情報は、MtsHlsUriTokenパラメーターを使用して渡すことができます。

    • プレーヤーが解読URIを取得した後、プレーヤーは自動的に解読キーを取得する要求を送信します。 プレーヤが復号鍵を取得した後、プレーヤは、再生のために暗号化されたTSファイルを復号します。

    • ビデオ再生URLは https://demo.aliyundoc.com/encrypt-stream ****-hd.m3u8です。 リクエストにはMtsHlsUriTokenパラメーターを含める必要があります。

    • 最後のリクエストURLは https://demo.aliyundoc.com/encrypt-stream ****-hd.m3u8?MtsHlsUriToken=<Token> です。

    • 復号化URLは https://demo.aliyundoc.com?CipherText=ZjJmZGViNzUtZWY1Mi00Y2RlLTk3MTMtOT **** です。

    • 復号化の最終的なリクエストURLは、https://demo.aliyundoc.com?CipherText=ZjJmZGViNzUtZWY1Mi00Y2RlLTk3MTMtOT ****&MtsHlsUriToken=<発行されたトークン> です。

    M3U8暗号化および書き換えが有効になっていない

    処理中

    • プレイヤーは、M3U8ファイルのURLを取得した後、M3U8ファイルのEXT-X-KEYのURLを解析してアクセスします。 このようにして、プレーヤは、暗号文鍵が含まれた復号URLを得る。 復号化URLは、HLS暗号化の開始時に渡すEncryptConfigのDecryptKeyUriの値です。 詳細は、「リクエストパラメーター」をご参照ください。

    • プレーヤーが解読URIを取得した後、プレーヤーは自動的に解読キーを取得する要求を送信します。 プレーヤが復号鍵を取得した後、プレーヤは、再生のために暗号化されたTSファイルを復号します。

    • ビデオ再生URLは https://demo.aliyundoc.com/encrypt-stream ****-hd.m3u8です。

    • 最終的なリクエストURLは https://demo.aliyundoc.com/encrypt-stream ****-hd.m3u8です。

    • 復号化URLは https://demo.aliyundoc.com?CipherText=ZjJmZGViNzUtZWY1Mi00Y2RlLTk3MTMtOT **** です。

    • 復号化の最終要求URLは https://demo.aliyundoc.com?CipherText=ZjJmZGViNzUtZWY1Mi00Y2RlLTk3MTMtOT **** です。

関連ドキュメント

暗号化されたビデオを再生する