使用动态加密和密钥传送保护内容

媒体服务徽标 v3


媒体服务 v2 文档 | 代码示例 | 故障排除指南

借助 Azure 媒体服务,在媒体从计算机离开到存储、处理和传送的整个过程中确保其安全。 借助媒体服务,可以传送使用高级加密标准 (AES-128) 或以下两个主要数字版权管理 (DRM) 系统中任意一个动态加密的直播和点播内容:Microsoft PlayReady 和 Apple FairPlay。

FairPlay Streaming 是 Apple 的一项技术,仅适用于在 iOS 设备、Apple TV 和 macOS 上的 Safari 中通过 HTTP Live Streaming (HLS) 传输的视频。 媒体服务还提供了用于向已授权客户端传送 AES 密钥和 DRM(PlayReady、Widevine 和 FairPlay)许可证的服务。 如果内容使用 AES 明文密钥加密并通过 HTTPS 发送,则在到达客户端之前,内容不会处于明文状态。

注意

Google Widevine 内容保护服务目前在 Azure 中国区域不可用。

在媒体服务 v3 中,内容密钥与流定位符相关联(参阅此示例)。 如果使用媒体服务密钥传送服务,可让 Azure 媒体服务自动生成内容密钥。 如果使用自己的密钥传送服务,或者需要处理高可用性方案(需要在两个数据中心使用相同的内容密钥),则应自行生成内容密钥。

播放器请求流时,媒体服务通过 AES 明文密钥或 DRM 加密使用指定的密钥来动态加密内容。 为了解密流,播放器将从媒体服务密钥传送服务或者指定的密钥传送服务请求密钥。 为了确定是否已授权用户获取密钥,服务将评估你为密钥指定的内容密钥策略。

内容保护系统

可以使用 REST API 或媒体服务客户端库来配置许可证和密钥的授权与身份验证策略。

注意

媒体服务强制要求对 KeyDelivery、RESTv2、流式处理终结点和实时事件流式处理源发出的所有请求使用 TLS 1.2。 使用现有 TLS 1.0 或 1.1 的帐户可以不遵守此强制要求。 如果你想要强制要求对这些媒体服务终结点发出的所有请求使用 TLS 1.2,请联系 AMS 支持部门。

支持 DRM 客户端的浏览器

常用的浏览器支持以下 DRM 客户端:

浏览者 加密
Microsoft Edge、Internet Explorer 11 PlayReady
Safari FairPlay

控制内容访问

可以通过配置内容密钥策略来控制谁有权访问内容。 媒体服务支持通过多种方式对发出密钥请求的用户进行授权。 客户端(播放器)必须符合该策略才能将密钥传送到客户端。 内容密钥策略可以采用开放令牌限制。

若要在不授权的情况下向任何人颁发许可证,可以使用开放限制的内容密钥策略。 例如,如果你的收入基于广告而不是基于订阅。

使用令牌限制的内容密钥策略时,内容密钥仅发送到可在许可证/密钥请求中提供有效 JWT 令牌或简单 Web 令牌 (SWT) 的客户端。 此令牌必须由 STS 颁发。

将 Azure AD 用作 STS

可以使用 Azure AD 作为 STS。 必须将它配置为创建令牌,该令牌使用指定密钥以及在令牌限制配置中指定的颁发声明进行签名。 如果满足以下两个条件,则媒体服务许可证/密钥传送服务会将请求的许可证或密钥返回到客户端:

  • 令牌有效。
  • 令牌中的声明与为许可证或密钥配置的声明相匹配。

配置令牌限制策略时,必须指定主验证密钥、颁发者和受众参数。 主验证密钥包含为令牌签名时使用的密钥。 颁发者是颁发令牌的 STS。 受众(有时称为范围)描述该令牌的意图,或者令牌授权访问的资源。 媒体服务许可证/密钥传送服务验证令牌中的值是否与模板中的值匹配。

令牌重放防护

令牌重放预防功能可让你设置一个限制,以限制可使用同一令牌请求密钥或许可证的次数。 可以在令牌中添加 urn:microsoft:azure:mediaservices:maxuses 类型的声明,其中值是令牌可用于获取许可证或密钥的次数。 对密钥传送服务使用同一令牌的所有后续请求都将返回未经授权的响应。

注意事项

  • 你必须控制令牌生成。 声明需要放在令牌本身中。
  • 使用此功能时,令牌过期时间超过接收请求时间一小时以上的请求将被拒绝,并返回未经授权的响应。
  • 令牌由其签名唯一标识。 对有效负荷的任何更改(例如,对到期时间或声明的更新)都会更改令牌的签名,并且该令牌将算作密钥传送服务之前没有遇到过的新令牌。
  • 如果令牌超过了 maxuses 值,则播放将失败。
  • 它可用于所有现有的受保护内容(仅需要更改颁发的令牌)。
  • 它同时使用 JWT 和 SWT。

使用自定义 STS

你可能想要使用自定义 STS 来提供令牌。 原因包括:

  • 你的标识提供者 (IDP) 不支持 STS。

  • 你在集成 STS 与你的订户计费系统时可能需要更多弹性或更严格的控制。

    例如,OTT 服务运营商可能提供多个订户套餐,如高级、基本和运动。 运营商可能想要让令牌中的声明与订户套餐匹配,这样,只有特定套餐中的内容可供使用。 在此情况下,自定义 STS 可提供所需的弹性和控制度。

  • 在令牌中包含自定义声明,以便在不同的 ContentKeyPolicyOptions 和不同的 DRM 许可证参数(例如,订阅许可证与租赁许可证)之间选择。

  • 包含一个声明,用于表示令牌授权访问的密钥的内容密钥标识符。

使用自定义 STS 时,必须进行两项更改:

  • 为资产配置许可证传送服务时,需要指定自定义 STS 用于验证的安全密钥,而不是来自 Azure AD 的当前密钥。
  • 生成 JTW 令牌时,需要指定安全密钥,而不是 Azure AD 中当前 X509 证书的私钥。

有两种类型的安全密钥:

  • 对称密钥:使用同一密钥来生成和验证 JWT。
  • 非对称密钥:使用 X509 证书中的私钥-公钥对,私钥用于加密/生成 JWT,公钥用于验证令牌。

注意

如果使用 .NET Framework/C# 作为开发平台,用于非对称安全密钥的 X509 证书的密钥长度必须至少为 2048。 此密钥长度是 .NET Framework 中 System.IdentityModel.Tokens.X509AsymmetricSecurityKey 类的要求。 否则,将引发以下异常:IDX10630:用于签名的 'System.IdentityModel.Tokens.X509AsymmetricSecurityKey' 不能小于 '2048' 位。

使用媒体服务以外的许可证/密钥传送服务

如果要使用不同的许可证/密钥传送服务,可以编辑密钥策略模板。

操作方法、教程和示例

.Net 数字版权管理示例演示如何通过 .NET 使用媒体服务 v3 实施多 DRM 系统。

下面提供了适用于 Node.JS 和 Python 的更多内容保护示例:

Node.JS Python 说明
Node.JS:基本的 Playready DRM 内容保护和流式处理 Python:基本的 Playready DRM 内容保护和流式处理 演示如何使用 PlayReady DRM 进行编码和流式传输