使用双令牌身份验证

如需在观看者访问流式传输资源时强制执行双令牌身份验证,请配置单独的路由。路由是一种配置,用于匹配媒体 CDN 的请求并将 HTTP 流量定向到源。媒体 CDN 支持 HTTP Live Streaming (HLS) 或基于 HTTP 的动态自适应流式传输 (DASH) 资源的路由。如需详细了解 Media CDN 中的路由,请参阅配置服务路由

对于 HLS 流,媒体 CDN 支持通过 Cookie 和网址查询参数(不使用 Cookie)进行双令牌身份验证。对于 DASH 流,媒体 CDN 仅支持基于 Cookie 的双令牌身份验证。

本页面介绍如何配置 Media CDN 路由,以通过双令牌身份验证帮助保护内容。

准备工作

执行以下操作:

  1. 对于短时令牌,请选择以下签名算法之一:

    • Ed25519 签名
    • 基于对称密钥的哈希消息认证码 (HMAC)

    您只能为配置为生成新的长效令牌的路由启用对称 HMAC 签名算法。我们建议您使用 Ed25519 签名以获得最佳性能和安全性,仅在需要与其他 CDN 兼容时才使用对称密钥 HMAC。

  2. EdgeCacheKeyset 资源中添加必需的键。

    令牌必须使用 EdgeCacheKeyset 资源中的密钥进行签名或验证。密钥集必须包含所选签名算法的正确密钥。下表介绍了每种签名算法及其所需的密钥。

    签名算法 密钥集中所需的密钥
    Ed25519 公钥
    HMAC-SHA1 验证共享密钥
    HMAC-SHA256 验证共享密钥

    最佳实践是创建两个单独的密钥集,一个用于短时令牌,另一个用于长时令牌。

    不过,如果您使用的是 DASH 和动态媒体呈现说明 (MPD) 文件,则必须为长时效令牌和短时效令牌使用相同的密钥集。

  3. 对于长期令牌,请选择以下令牌格式之一:

    • Cookie
    • 网址查询参数

设置短期令牌

根据您要使用的签名算法,使用以下选项之一设置短时令牌。

Ed25519 签名

  1. 生成私钥:

    openssl genpkey -algorithm ed25519 -outform PEM -out SSL_KEY_NAME.private.key
    

    SSL_KEY_NAME 替换为密钥名称。

  2. 从私钥生成公钥:

    openssl pkey -outform DER -pubout -in SSL_KEY_NAME.private.key |\
    tail -c +13 |\
    python3 -c "import base64, sys; print(('%s' % base64.urlsafe_b64encode(sys.stdin.buffer.read()))[2:-1])"
    
  3. 创建包含单个公钥的新密钥集:

    控制台

    1. 在 Google Cloud 控制台中,前往 Media CDN 页面。

      前往媒体 CDN

    2. 点击密钥集标签页。

    3. 点击 创建密钥集

    4. 名称中,输入唯一的密钥集名称。

    5. 可选:对于说明,输入密钥集的说明。

    6. 可选:点击添加标签,然后为密钥集输入一个或多个键值对。

    7. 点击添加公钥,然后执行以下操作:

      1. ID 部分,输入字母数字 ID。
      2. 选择输入值,然后指定 Ed25519 公钥的 base64 编码值。
    8. 点击创建密钥集

    gcloud

    使用 gcloud edge-cache keysets create 命令

    gcloud edge-cache keysets create SHORT_KEYSET_NAME \
      --public-key='id=SSL_PUBLIC_KEY_NAME,value=SSL_PUBLIC_KEY_VALUE'
    

    替换以下内容:

    • SHORT_KEYSET_NAME:唯一的密钥集名称,例如 prod-vod-keyset
    • SSL_PUBLIC_KEY_NAME:SSL 公钥的名称
    • SSL_PUBLIC_KEY_VALUE:SSL 公钥的值

    如需查看与密钥集关联的密钥,请使用 gcloud edge-cache keysets describe 命令

    gcloud edge-cache keysets describe prod-vod-keyset
    

    输出类似于以下内容:

    name: prod-vod-keyset
    description: "Keyset for prod.example.com"
    publicKeys:
    - id: "key-20200918"
      value: "DThVLjhAKm3VYOvLBAwFZ5XbjVyF98Ias8NZU0WEM9w"
    - id: "key-20200808"
      value: "Lw7LDSaDUrbDdqpPA6JEmMF5BA5GPtd7sAjvsnh7uDA="
    

    Terraform

    resource "google_network_services_edge_cache_keyset" "default" {
      name        = "prod-vod-keyset"
      description = "Keyset for prod.example.com"
      public_key {
        id    = "key-20200918"
        value = "FHsTyFHNmvNpw4o7-rp-M1yqMyBF8vXSBRkZtkQ0RKY" # Update Ed25519 public key
      }
      public_key {
        id    = "key-20200808"
        value = "Lw7LDSaDUrbDdqpPA6JEmMF5BA5GPtd7sAjvsnh7uDA=" # Update Ed25519 public key
      }
    }

对称密钥 HMAC

  1. 如果您之前未使用过 Secret Manager,请配置 Secret Manager

  2. 创建 Secret

  3. 以二进制格式添加密文版本

  4. 向 Media CDN 服务账号授予 Secret Manager Access 角色 (roles/secretmanager.secretAccessor):

    控制台

    1. 在 Google Cloud 控制台中,前往 Secret Manager 页面。

      转到 Secret Manager

    2. 选中相应 Secret 名称旁边的复选框。

    3. 点击显示信息面板

    4. 在信息面板中,点击添加主账号

    5. 新的主账号部分,输入媒体 CDN 服务账号,格式如下:

      service-PROJECT_NUMBER@gcp-sa-mediaedgefill.iam.gserviceaccount.com
      

      PROJECT_NUMBER 替换为您的项目编号。

    6. 对于选择角色,请选择 Secret Manager,然后选择 Secret Manager Secret Accessor

    gcloud

    使用 gcloud secrets add-iam-policy-binding 命令

    gcloud secrets add-iam-policy-binding projects/PROJECT_NUMBER/secrets/SECRET_ID \
      --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-mediaedgefill.iam.gserviceaccount.com" \
      --role="roles/secretmanager.secretAccessor"
    

    替换以下内容:

    • PROJECT_NUMBER:您的项目编号
    • SECRET_ID:相应 Secret 的 ID
  5. 访问您的 Secret 版本,并复制 Secret 路径(包括版本号)。

  6. 使用验证共享密钥中的共享密钥创建新的密钥集:

    控制台

    1. 在 Google Cloud 控制台中,前往 Media CDN 页面。

      前往媒体 CDN

    2. 点击密钥集标签页。

    3. 点击 创建密钥集

    4. 名称中,输入唯一的密钥集名称。

    5. 可选:对于说明,输入密钥集的说明。

    6. 可选:点击添加标签,然后为密钥集输入一个或多个键值对。

    7. 如需指定验证共享密钥,请点击添加验证共享密钥,然后执行以下操作:

      1. 对于 Secret,请从列表中选择一个 Secret,通过指定资源 ID 手动输入一个 Secret,或创建新 Secret,然后选择该 Secret。

      2. 对于密文版本,请从列表中选择一个版本,或创建新的密文版本,然后选择该版本。

    8. 点击创建密钥集

    gcloud

    使用 gcloud edge-cache keysets create 命令

    gcloud edge-cache keysets create SHORT_KEYSET_NAME \
      --validation-shared-key='secret_version=projects/PROJECT_NUMBER/secrets/SECRET_ID/versions/KEY_VERSION'
    

    替换以下内容:

    • SHORT_KEYSET_NAME:密钥集的唯一名称,例如 prod-vod-keyset
    • PROJECT_NUMBER:您的项目 ID
    • SECRET_ID:相应 Secret 的资源 ID
    • KEY_VERSION:您要使用的 Secret 版本

设置长时令牌

Google-owned and managed keys 的范围限定为密钥集。这意味着两个不同的密钥集具有不同的Google-owned and managed keys。Google-owned and managed keys 会定期轮替。

使用以下任一选项设置长期令牌:

控制台

  1. 创建或修改密钥集

  2. 密钥部分中,选择使用Google-owned and managed key 进行双令牌身份验证

gcloud 和 YAML

使用以下任一选项:

  • 创建 Google 管理的签名密钥:

    gcloud edge-cache keysets create LONG_KEYSET_NAME \
        --public-key='id=google-managed-key,managed=true'
    

    LONG_KEYSET_NAME 替换为密钥名称,例如 prod-vod-keyset-long

  • 修改现有密钥集:

    1. 将密钥集导出到 YAML 文件。使用 gcloud edge-cache keysets export 命令

      gcloud edge-cache keysets export LONG_KEYSET_NAME \
         --destination=prod-vod-keyset-long.yaml
      
    2. 在文本编辑器或配置管理工具中,修改密钥集配置,使其类似于以下内容:

      name: projects/my-project/locations/global/edgeCacheKeysets/LONG_KEYSET_NAME
      publicKeys:
      - id: some-key
        value: MC4CAQAwBQYDK2VwBCIEINV2iYugIWBuvGBJUQ_Ab69E4v4zcVqvgYHw-iZxGzcd
      - id: google-managed-key
        managed: true
      
    3. 导入修改后的键集。使用 gcloud edge-cache keysets import 命令

      gcloud edge-cache keysets import LONG_KEYSET_NAME \
          --source=prod-vod-keyset-long.yaml
      

您可以在长期令牌密钥集中添加其他公钥。密钥集最多可以包含 3 个公钥。实际上,这意味着密钥集可以包含两个用户管理的密钥和一个Google-owned and managed key。

媒体 CDN 始终使用 Google-owned and managed key生成令牌。用户管理的密钥只能用于验证。

添加其他公钥有助于让播放器应用使用您自己的私钥生成的签名请求来访问媒体播放列表和媒体片段。

配置令牌交换

本部分展示了如何通过创建多条路由来配置令牌交换。 借助路由,您可以根据内容类型、客户端属性和新鲜度要求来优化行为。在以下示例中,我们使用路由为媒体请求的每个部分配置令牌交换。

配置主清单路由以要求使用短时令牌

将 Media CDN 配置为在主清单路由上需要短时效令牌。

控制台

在主要清单路由上启用短时令牌身份验证:

  1. 在 Google Cloud 控制台中,前往 Media CDN 页面。

    前往媒体 CDN

  2. 如需打开服务的详情页面,请点击服务名称。

  3. 如需切换到修改模式,请点击修改按钮。

  4. 如需前往路由部分,请点击下一步

  5. 展开要向其添加主清单路由规则的主机规则。

  6. 点击添加路由规则

    或者,如需修改路线规则,请点击相应行中的修改

  7. 修改路由规则窗格中,为优先级设置一个值,例如 1

  8. 说明中,提供简短的说明,以便在规则列表中识别该规则。

  9. 匹配部分中,点击添加匹配条件。然后,执行以下操作:

    1. 对于匹配类型,选择路径模板匹配
    2. 对于路径匹配,请指定 HLS 主播放列表 (M3U8) 或 DASH 清单 (MPD) 文件的名称或路径模板。如需了解详情,请参阅路径匹配
  10. 点击高级配置

  11. 路由操作部分中,点击添加内容

  12. 对于类型,选择 CDN 政策

  13. 签名请求部分,针对签名请求模式,选择需要令牌

  14. 已签名的请求密钥集部分中,执行以下操作:

    1. 如需指定短时令牌的密钥集,请点击选择密钥集,然后选择您的短时令牌密钥集

      或者,如需创建包含所需密钥的新密钥集,请点击创建新密钥集。然后,选择该文件。

    2. 对于签名算法,选择使用公钥的 Ed25519

    3. 对于令牌查询参数,保留默认值 edge-cache-token

      或者,如果您计划使用 HLS 清单网址查询参数(而非 Cookie)进行身份验证,请指定用于存储请求令牌的参数。

    4. 对于最长有效时间,请以秒为单位指定传入请求令牌的最长有效时间。

  15. 如需保存路线操作部分中的更改,请点击完成

  16. 如需保存路线规则中的更改,请点击保存

gcloud 和 YAML

  1. 将 Media CDN 配置导出到 YAML 文件中。使用 gcloud edge-cache services export 命令

    gcloud edge-cache services export SERVICE_NAME \
        --destination=FILENAME.yaml
    

    替换以下内容:

    • SERVICE_NAME:服务的名称
    • FILENAME:您的 YAML 文件的名称
  2. 如需在主清单路由规则中启用短时令牌身份验证,请在 YAML 文件的路由 cdnPolicy 部分中指定 signedTokensOptions 配置。

      pathMatchers:
      - name: "ROUTE_NAME"
        routeRules:
        - priority: 1
          description: "ROUTE_DESCRIPTION"
          origin: "ORIGIN_NAME"
          matchRules:
          - pathTemplateMatch: "/MANIFEST_OR_PLAYLIST"
          routeAction:
            cdnPolicy:
              cacheMode: CACHE_ALL_STATIC
              signedRequestMode: REQUIRE_TOKENS
              signedRequestKeyset: SHORT_KEYSET_NAME
              signedRequestMaximumExpirationTtl: SIGNED_REQUEST_MAXIMUM_EXPIRATION_TIME
              signedTokenOptions:
                tokenQueryParameter: SHORT_TOKEN_NAME
    

    替换以下内容:

    • ROUTE_NAME:路由规则的名称
    • ROUTE_DESCRIPTION:路由规则的说明
    • ORIGIN_NAME:来源名称
    • MANIFEST_OR_PLAYLIST:HLS 主播放列表 (M3U8) 或 DASH 清单 (MPD) 文件的名称。如需了解详情,请参阅路径匹配
    • SHORT_KEYSET_NAME:用于短时令牌的密钥集名称
    • SIGNED_REQUEST_MAXIMUM_EXPIRATION_TIME:签名请求的过期时间,例如 600s。如需了解详情,请参阅 signedRequestMaximumExpirationTtl
    • 可选:SHORT_TOKEN_NAME:用于查找短令牌的查询参数。默认值为 edge-cache-token。如需了解详情,请参阅 SignedTokenOptions

    使用对称密钥 HMAC 时,在 signedTokenOptions 部分中,附加 allowedSignatureAlgorithms,并将其值设为 HMAC_SHA_256

           allowedSignatureAlgorithms:
           - HMAC_SHA_256
    
  3. 如需更新服务,请从 YAML 文件导入 Media CDN 配置。使用 gcloud edge-cache services import 命令

    gcloud edge-cache services import SERVICE_NAME \
        --source=FILENAME.yaml
    

这样就完成了启用单令牌身份验证的流程。

如需配置双令牌身份验证,请继续阅读以下部分。

配置主要清单路由规则以生成长时效令牌

配置媒体 CDN,以在主清单路由上生成长效令牌。选择使用 Cookie 或网址查询参数来生成这些令牌。

控制台

修改主清单路由规则,以便媒体 CDN 可以在相应路由上生成长期令牌:

  1. 修改路由规则页面上,点击高级配置
  2. 对于类型,选择 CDN 政策
  3. 展开双令牌身份验证
  4. 对于签名操作,选择生成新的长时令牌
  5. 对于签名类型,请选择以下任一选项:

    • 通过 Cookie(适用于 HLS 和 DASH 流式传输):配置媒体 CDN 以返回包含主清单响应的 Edge-Cache-Cookie
    • 通过 HLS 清单网址查询参数(不使用 Cookie):配置 Media CDN 以通过将长期令牌附加到每个网址来操纵 HLS 主清单。
  6. 生成新的长时令牌部分中,执行以下操作:

    1. 如需为长期令牌指定密钥集,请点击选择密钥集,然后选择您的长期令牌密钥集

      或者,点击创建新密钥集,以创建包含所需密钥的新密钥集。然后,选择该文件。

    2. 对于令牌 TTL,请以秒为单位指定长效令牌的最长生命周期。

    3. 对于签名类型,如果您选择了通过 Cookie 选项,请在复制的参数部分中选择您希望 Media CDN 从短时令牌复制到长时令牌的参数。如需使用双令牌身份验证,您必须选择 PathGlobs(或其别名 aclpaths)或 URLPrefix

      如果您选择了通过 HLS 清单网址查询参数选项,请为令牌查询参数保留默认值 edge-cache-token

  7. 如需保存路线操作部分中的更改,请点击完成

  8. 如需保存路线规则中的更改,请点击保存

    系统会显示一条消息,询问您是希望自动还是手动创建媒体播放列表和媒体片段的路由。如果您选择自动选项,系统会为 Cookie 签名创建一个新的路由,并为无 Cookie 签名创建两个路由。如果您选择手动选项,请继续学习下一部分。

gcloud 和 YAML

修改主清单路由规则的 addSignatures 部分,以便 Media CDN 可以在相应路由上生成长时效令牌:

Cookie

          addSignatures:
            actions:
              - GENERATE_COOKIE
            keyset: LONG_KEYSET_NAME
            tokenTtl: TOKEN_EXPIRATION_TIME
            copiedParameters:
              - PathGlobs
              - SessionID

替换以下内容:

  • LONG_KEYSET_NAME:长期有效的令牌密钥集名称

  • TOKEN_EXPIRATION_TIME:长期令牌的到期时间,例如 86400s 表示到期时间为 1 天

此代码示例实现了以下更改:

  • addSignatures.actions: GENERATE_COOKIE:配置媒体 CDN 以返回包含主清单响应的 Edge-Cache-Cookie

  • copiedParameters.PathGlobs:将媒体 CDN 配置为将 PathGlobs 从短时令牌复制到长时令牌。如需使用双令牌身份验证,您必须使用 copiedParameters.PathGlobscopiedParameters.URLPrefix。如需了解详情,请参阅 copiedParameters

  • 可选:copiedParameters.SessionID:配置 Media CDN 以将 SessionID 从短时令牌复制到长时令牌

应用 GENERATE_COOKIE 操作后,Media CDN 会在主清单响应中返回类似于以下内容的 Set-Cookie 标头:

Set-Cookie: Edge-Cache-Cookie=PathGlobs=PATHS~SessionID=SESSION_ID~Expires=EXPIRATION~_GO=Generated~Signature=SIGNATURE

网址查询参数

          addSignatures:
            actions:
              - GENERATE_TOKEN_HLS_COOKIELESS
            keyset: LONG_KEYSET_NAME
            tokenTtl: TOKEN_EXPIRATION_TIME
            copiedParameters:
              - PathGlobs
              - SessionID
            tokenQueryParameter: LONG_TOKEN_NAME

替换以下内容:

  • LONG_KEYSET_NAME:长期密钥集的名称

  • TOKEN_EXPIRATION_TIME:长期令牌的到期时间,例如 86400s 表示到期时间为 1 天

此代码示例实现了以下更改:

  • addSignatures.actions: GENERATE_TOKEN_HLS_COOKIELESS:配置 Media CDN,以通过将长期令牌附加到每个 URI 来操纵 HLS 主清单。

  • copiedParameters.PathGlobs:将媒体 CDN 配置为将 PathGlobs 从短时令牌复制到长时令牌。如需使用双令牌身份验证,您必须使用 copiedParameters.PathGlobscopiedParameters.URLPrefix。如需了解详情,请参阅 copiedParameters

  • 可选:copiedParameters.SessionID:配置 Media CDN 以将 SessionID 从短时令牌复制到长时令牌。

  • 可选:LONG_TOKEN_NAME:用于放置生成的长令牌的查询参数。默认值为 edge-cache-token。如需了解详情,请参阅 tokenQueryParameter

以下清单文件显示了应用的 GENERATE_TOKEN_HLS_COOKIELESS 操作:

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1280000,AVERAGE-BANDWIDTH=1000000
http://example.com/HLS_PRIMARY_PLAYLIST.m3u8?LONG_TOKEN_NAME=PathGlobs=PATHS~SessionID=SESSION_ID~Expires=EXPIRATION~_GO=Generated~Signature=SIGNATURE

媒体 CDN 会验证短时令牌,然后在 LONG_TOKEN_NAME 查询参数中生成并存储长时令牌。

配置媒体播放列表和媒体片段路由,以要求使用长时效令牌

将媒体播放列表和媒体片段路由配置为需要长时效令牌。

控制台

Cookie

为媒体播放列表和媒体片段路由创建路由规则:

  1. 修改 Edge Cache 服务页面上的路由部分中,点击具有主清单路由的主机规则。
  2. 点击添加路由规则
  3. 修改路由规则窗格中,为优先级设置一个大于主清单路由的值,例如 2。值越高,优先级越低。
  4. 说明中,提供简短的说明,以便在规则列表中识别该规则。
  5. 按建议设置以下字段:

    • 选择来源:与主要清单路由规则的来源相同
    • 添加匹配条件:与主清单路由规则相同
    • 类型CDN 政策
    • 签名请求模式需要令牌
    • 选择密钥集:与长效令牌相同
    • 签名算法:与主清单路由规则的签名算法相同
  6. 展开双令牌身份验证

  7. 对于签名操作,保留默认值 None

  8. 点击完成,然后点击保存

网址查询参数

  1. 为媒体播放列表创建路由规则。

    1. 修改 Edge Cache 服务页面上的路由部分中,点击具有主清单路由的主机规则。
    2. 点击添加路由规则
    3. 修改路由规则窗格中,为优先级设置一个大于主清单路由的值,例如 2。值越高,优先级越低。
    4. 说明中,提供简要说明,以便在规则列表中识别该规则。
    5. 按建议设置以下字段:

      • 选择来源:与主要清单路由规则的来源相同
      • 添加匹配条件:与主清单路由规则相同
      • 类型CDN 政策
      • 签名请求模式需要令牌
      • 选择密钥集:与长效令牌相同
      • 签名算法:与主清单路由规则的签名算法相同
      • 令牌查询参数:与长效令牌的令牌查询参数相同
    6. 展开双令牌身份验证

    7. 对于签名操作,选择传播现有的长时令牌

      仅当 Media CDN 验证长期令牌是使用通过 HLS 清单网址查询参数(不使用 Cookie)签名类型生成的之后,此选项才会启用。

    8. 对于令牌查询参数,保留默认值 edge-cache-token

    9. 点击完成,然后点击保存

  2. 为媒体片段创建路由规则。

    此路由与媒体播放列表的路由类似,但存在以下主要区别:

    • 对于优先级,请设置一个大于媒体播放列表路由规则的值,例如 3
    • 说明中,提供简要说明,以便在规则列表中识别该规则。
    • 双令牌身份验证部分中,对于签名操作,保留默认值

gcloud 和 YAML

修改 YAML 文件:

Cookie

配置媒体播放列表和媒体片段,以要求使用长效 Cookie:

    - priority: 2
      description: "SEGMENTS_ROUTE_DESCRIPTION"
      origin: "ORIGIN_NAME"
      matchRules:
      - pathTemplateMatch: "/**.m3u8" # HLS media playlists
      - pathTemplateMatch: "/**.ts" # HLS segments
      - pathTemplateMatch: "/**.m4s" # DASH / CMAF segments
      routeAction:
        cdnPolicy:
          cacheMode: CACHE_ALL_STATIC
          signedRequestMode: REQUIRE_TOKENS
          signedRequestKeyset: LONG_KEYSET_NAME

SEGMENTS_ROUTE_DESCRIPTION 替换为路由的说明。

此代码示例实现了以下更改:

  • priority: 2:路由的优先级。值越高,优先级越低。由于媒体播放列表和媒体片段的路由与任何以 .m3u8 结尾的文件名匹配,因此该路由的优先级必须低于您之前为主要清单创建的路由。
  • signedRequestMode: REQUIRE_TOKENS:针对媒体播放列表和媒体片段强制执行令牌。如果您使用的是静态媒体演示描述 (MPD) 文件,则长密钥集和短密钥集可能不同。如果您使用的是动态 MPD 文件,则长密钥集和短密钥集必须相同。
  • signedRequestKeyset: LONG_KEYSET_NAME:Media CDN 使用长效密钥集来验证用户代理提供的长效 Cookie,以用于媒体播放列表和媒体片段请求。

网址查询参数

添加两个路由配置:

  1. 配置 HLS 媒体清单路由以传播长时效令牌:

       - priority: 2
         description: "PLAYLIST_ROUTE_DESCRIPTION"
         origin: "ORIGIN_NAME"
         matchRules:
         - pathTemplateMatch: "/**.m3u8" # HLS media playlists
         routeAction:
           cdnPolicy:
           cacheMode: CACHE_ALL_STATIC
           signedRequestMode: REQUIRE_TOKENS
           signedRequestKeyset: LONG_KEYSET_NAME
           addSignatures:
             actions:
             - PROPAGATE_TOKEN_HLS_COOKIELESS
    

    PLAYLIST_ROUTE_DESCRIPTION 替换为路由的说明。

    此代码示例实现了以下更改:

    • priority: 2:路由的优先级。值越高,表示优先级越低。由于媒体播放列表的路由与任何以 .m3u8 结尾的文件名匹配,因此该路由的优先级必须低于您之前为主要清单创建的路由。
    • signedRequestMode: REQUIRE_TOKENS:针对媒体播放列表和媒体片段强制执行令牌。如果您使用的是静态媒体演示描述 (MPD) 文件,则长密钥集和短密钥集可能不同。如果您使用的是动态 MPD 文件,则长密钥集和短密钥集必须相同。
    • signedRequestKeyset: LONG_KEYSET_NAME:Media CDN 使用长效密钥集来验证用户代理提供的长效 Cookie,以用于媒体播放列表和媒体片段请求。
    • addSignatures.actions: PROPAGATE_TOKEN_HLS_COOKIELESS:配置媒体 CDN,以将长效令牌复制到媒体播放列表中的媒体段 URI。
  2. 配置细分路由以要求使用长时效令牌:

       - priority: 3
         description: "SEGMENTS_ROUTE_DESCRIPTION"
         origin: "ORIGIN_NAME"
         matchRules:
         - pathTemplateMatch: "/**.ts" # HLS segments
         routeAction:
           cdnPolicy:
             cacheMode: CACHE_ALL_STATIC
             signedRequestMode: REQUIRE_TOKENS
             signedRequestKeyset: LONG_KEYSET_NAME
    

    SEGMENTS_ROUTE_DESCRIPTION 替换为路由的说明。

    此代码示例实现了以下更改:

    • priority: 3:路由的优先级。值越高,表示优先级越低。此路由的优先级必须低于您之前为媒体播放列表创建的路由。
    • signedRequestMode: REQUIRE_TOKENS:针对媒体播放列表和媒体片段强制执行令牌。
    • signedRequestKeyset: LONG_KEYSET_NAME:Media CDN 使用长效密钥集来验证用户代理为媒体播放列表和媒体段请求提供的长效签名令牌。

示例配置文件

以下代码示例展示了一个已完成的配置文件:

Cookie

name: SERVICE_NAME
routing:
  hostRules:
  - hosts:
    - DOMAIN_NAME
    pathMatcher: routes
  pathMatchers:
    - name: "ROUTE_NAME"
      routeRules:
      - priority: 1
        description: "ROUTE_DESCRIPTION"
        origin: "ORIGIN_NAME"
        matchRules:
        - pathTemplateMatch: "/HLS_MASTER_PLAYLIST.m3u8" # HLS primary playlists
        - pathTemplateMatch: "/DASH_MANIFESTS.mpd" # DASH manifests
        routeAction:
          cdnPolicy:
            cacheMode: CACHE_ALL_STATIC
            signedRequestMode: REQUIRE_TOKENS
            signedRequestKeyset: SHORT_KEYSET_NAME
            signedRequestMaximumExpirationTtl: SIGNED_REQUEST_MAXIMUM_EXPIRATION_TIME
            addSignatures:
              actions:
                - GENERATE_COOKIE
              keyset: LONG_KEYSET_NAME
              tokenTtl: TOKEN_EXPIRATION_TIME
              copiedParameters:
                - PathGlobs
                - SessionID
      - priority: 2
        description: "SEGMENTS_ROUTE_DESCRIPTION"
        origin: "ORIGN_NAME"
        matchRules:
        - pathTemplateMatch: "/**.m3u8" # HLS media playlists
        - pathTemplateMatch: "/**.ts" # HLS segments
        - pathTemplateMatch: "/**.m4s" # DASH / CMAF segments
        routeAction:
          cdnPolicy:
            cacheMode: CACHE_ALL_STATIC
            signedRequestMode: REQUIRE_TOKENS
            signedRequestKeyset: LONG_KEYSET_NAME

网址查询参数

name: SERVICE_NAME
routing:
  hostRules:
  - hosts:
    - DOMAIN_NAME
    pathMatcher: routes
  pathMatchers:
    - name: "ROUTE_NAME"
      routeRules:
      - priority: 1
        description: "ROUTE_DESCRIPTION"
        origin: "ORIGIN_NAME"
        matchRules:
        - pathTemplateMatch: "/HLS_PRIMARY_PLAYLIST.m3u8" # HLS primary playlists
        routeAction:
          cdnPolicy:
            cacheMode: CACHE_ALL_STATIC
            signedRequestMode: REQUIRE_TOKENS
            signedRequestKeyset: SHORT_KEYSET_NAME
            signedRequestMaximumExpirationTtl: SIGNED_REQUEST_MAXIMUM_EXPIRATION_TIME
            signedTokenOptions:
              tokenQueryParameter: SHORT_TOKEN_NAME
            addSignatures:
              actions:
                - GENERATE_TOKEN_HLS_COOKIELESS
              keyset: LONG_KEYSET_NAME
              tokenTtl: TOKEN_EXPIRATION_TIME
              tokenQueryParameter: LONG_TOKEN_NAME
              copiedParameters:
                - PathGlobs
                - SessionID
      - priority: 2
        description: "PLAYLIST_ROUTE_DESCRIPTION"
        origin: "ORIGIN_NAME"
        matchRules:
        - pathTemplateMatch: "/**.m3u8" # HLS media playlists
        routeAction:
          cdnPolicy:
            cacheMode: CACHE_ALL_STATIC
            signedRequestMode: REQUIRE_TOKENS
            signedRequestKeyset: LONG_KEYSET_NAME
            addSignatures:
              actions:
                - PROPAGATE_TOKEN_HLS_COOKIELESS
      - priority: 3
        description: "SEGMENTS_ROUTE_DESCRIPTION"
        origin: "ORIGIN_NAME"
        matchRules:
        - pathTemplateMatch: "/**.ts" # HLS segments
        routeAction:
          cdnPolicy:
            cacheMode: CACHE_ALL_STATIC
            signedRequestMode: REQUIRE_TOKENS
            signedRequestKeyset: LONG_KEYSET_NAME

在应用服务器上生成短时令牌

如需了解如何生成令牌,请参阅生成令牌

应用纵深防御内容保护措施

最佳实践是启用来源身份验证,如下所示: