

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# SPEKE API v1
<a name="the-speke-api"></a>

这是用于安全打包器和编码器密钥交换 (SPEKE) v1 的 REST API。使用此规范为使用加密的客户提供 DRM 版权保护。为了符合 SPEKE，您的 DRM 密钥提供程序必须公开本规范中描述的 REST API。加密程序对您的密钥提供程序进行 API 调用。

**注意**  
本规范中的代码示例仅用于说明目的。您无法运行这些示例，因为它们不是完整的 SPEKE 实现的一部分。

SPEKE 使用 DASH 行业论坛内容保护信息交换格式 (DASH-IF-CPIX) 数据结构定义进行密钥交换，但有一些限制。 DASH-IF-CPIX定义了一个架构，以提供从 DRM 平台到加密器的可扩展的多 DRM 交换。这使得在内容压缩和打包时允许对所有自适应比特率打包格式进行内容加密。自适应比特率打包格式包括 HLS、DASH 和 MSS。

有关交易格式的详细信息，请参阅达世币行业论坛CPIX规范，网址为 https://dashif。 org/docs/DASH-IF-CPIX-v2-0.pdf。

**Topics**
+ [SPEKE API v1 - 有关 DASH-IF 规范的自定义项和约束](speke-constraints.md)
+ [SPEKE API v1 - 标准负载组件](standard-payload-components.md)
+ [SPEKE API v1 - 实时工作流方法调用示例](live-workflow-methods.md)
+ [SPEKE API v1 - VOD 工作流方法调用示例](vod-workflow-methods.md)
+ [SPEKE API v1 - 内容密钥加密](content-key-encryption.md)
+ [SPEKE API v1 - 检测信号](heartbeat.md)
+ [SPEKE API v1 - 覆盖密钥标识符](kid-override.md)

# SPEKE API v1 - 有关 DASH-IF 规范的自定义项和约束
<a name="speke-constraints"></a>

DASH-IF CPIX 规范，https://dashif。 org/docs/DASH-IF-CPIX-v2-0.pdf，支持多种用例和拓扑。SPEKE API 规范符合具有以下自定义项和约束的 CPIX 规范：
+ SPEKE 遵循 Encryptor Consumer 工作流。
+ 对于加密的内容密钥，SPEKE 应用以下限制：
  + SPEKE 不支持请求或响应负载的数字签名验证（XMLDSIG）。
  + SPEKE 需要基于 2048 位 RSA 的证书。
+ 对于轮换密钥工作流，SPEKE 需要 `ContentKeyUsageRule` 筛选条件 `KeyPeriodFilter`。SPEKE 会忽略所有其他 `ContentKeyUsageRule` 设置。
+ SPEKE 会忽略 `UpdateHistoryItemList` 功能。如果响应中包含该列表，则 SPEKE 会将其忽略。
+ SPEKE 支持密钥轮换。SPEKE 只使用 `ContentKeyPeriod@index 来跟踪关键时段。
+ 为了支持 MSS PlayReady，SPEKE 在`DRMSystem`标签下使用了一个自定义参数。`SPEKE:ProtectionHeader`
+ 对于 HLS 打包，如果 `URIExtXKey` 包含在响应中，则它必须包含要在 HLS 播放列表的 `EXT-X-KEY` 标签的 URI 参数中添加的完整数据，没有其他信号发送要求。
+ 对于 HLS 播放列表，在 `DRMSystem` 标签下，SPEKE 提供了可选的自定义参数 `speke:KeyFormat` 和 `speke:KeyFormatVersions`，对应于 `EXT-X-KEY` 标签的 `KEYFORMAT` 和 `KEYFORMATVERSIONS` 参数的值。

  HLS 初始化向量 (IV) 始终跟随段编号，除非由运算符显式指定。
+ 当请求密钥时，加密程序可能会在 `ContentKey` 元素上使用可选的 `@explicitIV` 属性。密钥提供程序可以使用 `@explicitIV` 来响应 IV，即使该属性未包含在请求中。
+ 加密程序创建密钥标识符 (`KID`)，这对于任何给定的内容 ID 和密钥周期保持不变。密钥提供程序在其对请求文档的响应中包含 `KID`。
+ 密钥提供程序可能包含 `Speke-User-Agent` 响应标头的值以确定本身用于调试目的。
+ 对于每个内容，SPEKE 目前不支持多个轨迹或密钥。

  符合 SPEKE 的加密程序充当客户端并向密钥提供程序端点发送 `POST` 操作。加密程序可能会发送定期 `heartbeat` 请求，以确保加密程序和密钥提供程序终端节点之间的连接正常。

# SPEKE API v1 - 标准负载组件
<a name="standard-payload-components"></a>

在任何 SPEKE 请求中，加密程序都可以请求针对一个或多个 DRM 系统的响应。加密程序在请求负载 `<cpix:DRMSystemList>` 中指定 DRM 系统。每个系统规范都包含密钥，并指示要返回的响应类型。

以下示例显示了一个 DRM 系统列表与单个 DRM 系统规范：

![\[RequestIntroSimple\]](http://docs.aws.amazon.com/zh_cn/speke/latest/documentation/images/RequestIntroSimple.png)


下表列出了每个 `<cpix:DRMSystem>` 的主要组件。


| 标识符 | 说明 | 
| --- | --- | 
|   `systemId` 或 `schemeId`   |  DRM 系统类型的唯一标识符，如在 DASH IF 组织中注册的。有关列表，请参阅 [DASH-IF 系统](https://dashif.org/identifiers/content_protection/)。 IDs  | 
|   `kid`   |   密钥 ID。这不是实际密钥，而是指向哈希表中的密钥的标识符。  | 
|   `<cpix:UriExtXKey>`   |  请求标准未加密密钥。密钥响应类型必须是此响应或 `PSSH` 响应。  | 
|   `<cpix:PSSH>`   |  请求保护系统特定标头 (PSSH)。这种标头包含对 `kid` 的引用、`systemID` 以及 DRM 供应商的自定义数据（作为常见加密 (CENC) 的一部分）。密钥响应类型必须是此响应或 `UriExtXKey` 响应。  | 

\$1标准密钥和 PSSH 的示例请求\$1

以下示例显示从加密程序到 DRM 密钥提供程序的示例请求的一部分，其中突出显示了主要组件。第一个请求针对的是标准密钥，第二个请求针对的是 PSSH 响应：

![\[RequestIntro1\]](http://docs.aws.amazon.com/zh_cn/speke/latest/documentation/images/RequestIntro1.png)


\$1标准密钥和 PSSH 的示例响应\$1

以下示例显示从 DRM 密钥提供程序到加密程序的相应响应：

![\[ResponseIntro1\]](http://docs.aws.amazon.com/zh_cn/speke/latest/documentation/images/ResponseIntro1.png)


# SPEKE API v1 - 实时工作流方法调用示例
<a name="live-workflow-methods"></a>

 *请求语法示例* 

以下 URL 是一个示例，并且不指示固定格式：

```
POST https://speke-compatible-server/speke/v1.0/copyProtection
```

 *请求正文* 

CPIX 元素。

 *请求标头* 


| Name | Type | 发生次数 | 说明 | 
| --- | --- | --- | --- | 
|   `AWS Authorization`   |  字符串  |  1..1  |  请参阅 [AWS Sigv4](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)   | 
|   `X-Amz-Security-Token`   |  字符串  |  1..1  |  请参阅 [AWS Sigv4](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)   | 
|   `X-Amz-Date`   |  字符串  |  1..1  |  请参阅 [AWS Sigv4](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)   | 
|   `Content-Type`   |  字符串  |  1..1  |  application/xml  | 

 *响应标头* 


| Name | Type | 发生次数 | 说明 | 
| --- | --- | --- | --- | 
|   `Speke-User-Agent`   |  字符串  |  1..1  |  用于标识密钥提供程序的字符串  | 
|   `Content-Type`   |  字符串  |  1..1  |  application/xml  | 

 *请求响应* 


| HTTP 代码 | 负载名称 | 发生次数 | 说明 | 
| --- | --- | --- | --- | 
|   `200 (Success)`   |  CPIX  |  1..1  |  DASH-CPIX 负载响应  | 
|   `4XX (Client error)`   |  客户端错误消息  |  1..1  |  客户端错误描述  | 
|   `5XX (Server error)`   |  服务器错误消息  |  1..1  |  服务器错误描述  | 

**注意**  
本部分中的示例不包含内容密钥加密。有关如何添加内容密钥加密的信息，请参阅[内容密钥加密](content-key-encryption.md)。

 *带有明文密钥的实时示例请求负载* 

以下示例显示加密程序到 DRM 密钥提供程序的典型实时请求负载：

```
<cpix:CPIX id="abc123" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" xmlns:speke="urn:aws:amazon:com:speke">
	<cpix:ContentKeyList>
		<cpix:ContentKey kid="98ee5596-cd3e-a20d-163a-e382420c6eff" explicitIV="OFj2IjCsPJFfMAxmQxLGPw=="></cpix:ContentKey>
	</cpix:ContentKeyList>
	<cpix:DRMSystemList>
		<!-- HLS AES-128 (systemId is implementation specific)-->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="81376844-f976-481e-a84e-cc25d39b0b33">
			<cpix:URIExtXKey></cpix:URIExtXKey>
			<speke:KeyFormat></speke:KeyFormat>
			<speke:KeyFormatVersions></speke:KeyFormatVersions>
		</cpix:DRMSystem>

		<!-- HLS SAMPLE-AES -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
			<cpix:URIExtXKey></cpix:URIExtXKey>
			<speke:KeyFormat></speke:KeyFormat>
			<speke:KeyFormatVersions></speke:KeyFormatVersions>
		</cpix:DRMSystem>

		<!-- Common encryption (Widevine)-->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
			<cpix:PSSH></cpix:PSSH>
		</cpix:DRMSystem>

		<!-- Common encryption / MSS (Playready) -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
			<speke:ProtectionHeader></speke:ProtectionHeader>
			<cpix:PSSH></cpix:PSSH>
		</cpix:DRMSystem>
	</cpix:DRMSystemList>
	<cpix:ContentKeyPeriodList>
		<cpix:ContentKeyPeriod id="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f" index="1" />
	</cpix:ContentKeyPeriodList>
	<cpix:ContentKeyUsageRuleList>
		<cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff">
			<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f" />
		</cpix:ContentKeyUsageRule>
	</cpix:ContentKeyUsageRuleList>
</cpix:CPIX>
```

 *带有明文密钥的实时示例响应负载* 

以下示例显示来自 DRM 密钥提供程序的典型响应负载：

```
<cpix:CPIX xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" xmlns:speke="urn:aws:amazon:com:speke" id="abc123">
	<cpix:ContentKeyList>
		<cpix:ContentKey explicitIV="OFj2IjCsPJFfMAxmQxLGPw==" kid="98ee5596-cd3e-a20d-163a-e382420c6eff">
			<cpix:Data>
				<pskc:Secret>
					<pskc:PlainValue>5dGAgwGuUYu4dHeHtNlxJw==</pskc:PlainValue>
				</pskc:Secret>
			</cpix:Data>
		</cpix:ContentKey>
	</cpix:ContentKeyList>
	<cpix:DRMSystemList>
		<!-- HLS AES-128 (systemId is implementation specific) -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="81376844-f976-481e-a84e-cc25d39b0b33">
			<cpix:URIExtXKey>aHR0cHM6Ly83azR5dHV4cTVkLmV4ZWN1dGUtYXBpLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tL0VrZVN0YWdlL2NsaWVudC9hYmMxMjMvOThlZTU1OTYtY2QzZS1hMjBkLTE2M2EtZTM4MjQyMGM2ZWZm</cpix:URIExtXKey>
			<speke:KeyFormat>aWRlbnRpdHk=</speke:KeyFormat>
			<speke:KeyFormatVersions>MQ==</speke:KeyFormatVersions>
		</cpix:DRMSystem>

		<!-- HLS SAMPLE-AES -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
			<cpix:URIExtXKey>aHR0cHM6Ly83azR5dHV4cTVkLmV4ZWN1dGUtYXBpLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tL0VrZVN0YWdlL2NsaWVudC9hYmMxMjMvOThlZTU1OTYtY2QzZS1hMjBkLTE2M2EtZTM4MjQyMGM2ZWZm</cpix:URIExtXKey>
			<speke:KeyFormat>Y29tLmFwcGxlLnN0cmVhbWluZ2tleWRlbGl2ZXJ5</speke:KeyFormat>
			<speke:KeyFormatVersions>MQ==</speke:KeyFormatVersions>
		</cpix:DRMSystem>

		<!-- Common encryption (Widevine) -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
			<cpix:PSSH>AAAAanBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAEoIARIQeSIcblaNbb7Dji6sAtKZzRoNd2lkZXZpbmVfdGVzdCIfa2V5LWlkOmVTSWNibGFOYmI3RGppNnNBdEtaelE9PSoCU0QyAA==</cpix:PSSH>
		</cpix:DRMSystem>

		<!-- Common encryption / MSS (Playready) -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
			<speke:ProtectionHeader>CgMAAAEAAQAAAzwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4ATwBXAGoAaAB0AHIAMwB1ADkAawArAHIAZABvADEASQBMAFkAMAByAGEAdwA9AD0APAAvAEsASQBEAD4APABDAEgARQBDAEsAUwBVAE0APgBCADMAQQA2AEEAMwB4AG0AdABkAEkAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AcABsAGEAeQByAGUAYQBkAHkALgBkAGkAcgBlAGMAdAB0AGEAcABzAC4AbgBlAHQALwBwAHIALwBzAHYAYwAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4AD8AUABsAGEAeQBSAGkAZwBoAHQAPQAxACYAYQBtAHAAOwBhAG0AcAA7AGEAbQBwADsAVQBzAGUAUwBpAG0AcABsAGUATgBvAG4AUABlAHIAcwBpAHMAdABlAG4AdABMAGkAYwBlAG4AcwBlAD0AMQA8AC8ATABBAF8AVQBSAEwAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==</speke:ProtectionHeader>
			<cpix:PSSH>AAADMHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAxAQAwAAAQABAAYDPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgBiAGgAdwBpAGUAWQAxAFcAdgBtADMARABqAGkANgBzAEEAdABLAFoAegBRAD0APQA8AC8ASwBJAEQAPgA8AEMASABFAEMASwBTAFUATQA+AGEAVABtAFAASgBWAEMAVgBaADYAcwA9ADwALwBDAEgARQBDAEsAUwBVAE0APgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAHAAcgBsAHMALgBhAHQAdgAtAHAAcwAuAGEAbQBhAHoAbwBuAC4AYwBvAG0ALwBjAGQAcAA8AC8ATABBAF8AVQBSAEwAPgA8AEMAVQBTAFQATwBNAEEAVABUAFIASQBCAFUAVABFAFMAPgA8AEkASQBTAF8ARABSAE0AXwBWAEUAUgBTAEkATwBOAD4ANwAuADEALgAxADQAMwA5AC4AMAA8AC8ASQBJAFMAXwBEAFIATQBfAFYARQBSAFMASQBPAE4APgA8AC8AQwBVAFMAVABPAE0AQQBUAFQAUgBJAEIAVQBUAEUAUwA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</cpix:PSSH>
		</cpix:DRMSystem>
	</cpix:DRMSystemList>
	<cpix:ContentKeyPeriodList>
		<cpix:ContentKeyPeriod id="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f" index="1" />
	</cpix:ContentKeyPeriodList>
	<cpix:ContentKeyUsageRuleList>
		<cpix:ContentKeyUsageRule kid="98ee5596-cd3e-a20d-163a-e382420c6eff">
			<cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f" />
		</cpix:ContentKeyUsageRule>
	</cpix:ContentKeyUsageRuleList>
</cpix:CPIX>
```

# SPEKE API v1 - VOD 工作流方法调用示例
<a name="vod-workflow-methods"></a>

 *请求语法示例* 

以下 URL 是一个示例，并且不指示固定格式。

```
POST https://speke-compatible-server/speke/v1.0/copyProtection
```

 *请求正文* 

CPIX 元素。

 *响应标头* 


| Name | Type | 发生次数 | 说明 | 
| --- | --- | --- | --- | 
|   `Speke-User-Agent`   |  字符串  |  1..1  |  用于标识密钥提供程序的字符串  | 
|   `Content-Type`   |  字符串  |  1..1  |  application/xml  | 

 *请求响应* 


| HTTP 代码 | 负载名称 | 发生次数 | 说明 | 
| --- | --- | --- | --- | 
|   `200 (Success)`   |  CPIX  |  1..1  |  DASH-CPIX 负载响应  | 
|   `4XX (Client error)`   |  客户端错误消息  |  1..1  |  客户端错误描述  | 
|   `5XX (Server error)`   |  服务器错误消息  |  1..1  |  服务器错误描述  | 

**注意**  
本部分中的示例不包含内容密钥加密。有关如何添加内容密钥加密的信息，请参阅[内容密钥加密](content-key-encryption.md)。

 *带有明文密钥的 VOD 示例请求负载* 

以下示例显示加密程序到 DRM 密钥提供程序的基本 VOD 请求负载：

```
<cpix:CPIX id="abc123" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" xmlns:speke="urn:aws:amazon:com:speke">
	<cpix:ContentKeyList>
		<cpix:ContentKey kid="98ee5596-cd3e-a20d-163a-e382420c6eff" explicitIV="OFj2IjCsPJFfMAxmQxLGPw=="></cpix:ContentKey>
	</cpix:ContentKeyList>
	<cpix:DRMSystemList>
		<!-- HLS AES-128 (systemId is implementation specific)-->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="81376844-f976-481e-a84e-cc25d39b0b33">
			<cpix:URIExtXKey></cpix:URIExtXKey>
			<speke:KeyFormat></speke:KeyFormat>
			<speke:KeyFormatVersions></speke:KeyFormatVersions>
		</cpix:DRMSystem>

		<!-- HLS SAMPLE-AES -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
			<cpix:URIExtXKey></cpix:URIExtXKey>
			<speke:KeyFormat></speke:KeyFormat>
			<speke:KeyFormatVersions></speke:KeyFormatVersions>
		</cpix:DRMSystem>

		<!-- Common encryption (Widevine)-->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
			<cpix:PSSH></cpix:PSSH>
		</cpix:DRMSystem>

		<!-- Common encryption / MSS (Playready) -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
			<speke:ProtectionHeader></speke:ProtectionHeader>
			<cpix:PSSH></cpix:PSSH>
		</cpix:DRMSystem>
	</cpix:DRMSystemList>
    </cpix:CPIX>
```

 *带有明文密钥的 VOD 示例响应负载* 

以下示例显示来自 DRM 密钥提供程序的基本 VOD 响应负载：

```
<cpix:CPIX xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" xmlns:speke="urn:aws:amazon:com:speke" id="abc123">
	<cpix:ContentKeyList>
		<cpix:ContentKey explicitIV="OFj2IjCsPJFfMAxmQxLGPw==" kid="98ee5596-cd3e-a20d-163a-e382420c6eff">
			<cpix:Data>
				<pskc:Secret>
					<pskc:PlainValue>5dGAgwGuUYu4dHeHtNlxJw==</pskc:PlainValue>
				</pskc:Secret>
			</cpix:Data>
		</cpix:ContentKey>
	</cpix:ContentKeyList>
	<cpix:DRMSystemList>
		<!-- HLS AES-128 (systemId is implementation specific) -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="81376844-f976-481e-a84e-cc25d39b0b33">
			<cpix:URIExtXKey>aHR0cHM6Ly83azR5dHV4cTVkLmV4ZWN1dGUtYXBpLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tL0VrZVN0YWdlL2NsaWVudC9hYmMxMjMvOThlZTU1OTYtY2QzZS1hMjBkLTE2M2EtZTM4MjQyMGM2ZWZm</cpix:URIExtXKey>
			<speke:KeyFormat>aWRlbnRpdHk=</speke:KeyFormat>
			<speke:KeyFormatVersions>MQ==</speke:KeyFormatVersions>
		</cpix:DRMSystem>

		<!-- HLS SAMPLE-AES -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
			<cpix:URIExtXKey>aHR0cHM6Ly83azR5dHV4cTVkLmV4ZWN1dGUtYXBpLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tL0VrZVN0YWdlL2NsaWVudC9hYmMxMjMvOThlZTU1OTYtY2QzZS1hMjBkLTE2M2EtZTM4MjQyMGM2ZWZm</cpix:URIExtXKey>
			<speke:KeyFormat>Y29tLmFwcGxlLnN0cmVhbWluZ2tleWRlbGl2ZXJ5</speke:KeyFormat>
			<speke:KeyFormatVersions>MQ==</speke:KeyFormatVersions>
		</cpix:DRMSystem>

		<!-- Common encryption (Widevine) -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
			<cpix:PSSH>AAAAanBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAEoIARIQeSIcblaNbb7Dji6sAtKZzRoNd2lkZXZpbmVfdGVzdCIfa2V5LWlkOmVTSWNibGFOYmI3RGppNnNBdEtaelE9PSoCU0QyAA==</cpix:PSSH>
		</cpix:DRMSystem>

		<!-- Common encryption / MSS (Playready) -->
		<cpix:DRMSystem kid="98ee5596-cd3e-a20d-163a-e382420c6eff" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
			<speke:ProtectionHeader>CgMAAAEAAQAAAzwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4ATwBXAGoAaAB0AHIAMwB1ADkAawArAHIAZABvADEASQBMAFkAMAByAGEAdwA9AD0APAAvAEsASQBEAD4APABDAEgARQBDAEsAUwBVAE0APgBCADMAQQA2AEEAMwB4AG0AdABkAEkAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AcABsAGEAeQByAGUAYQBkAHkALgBkAGkAcgBlAGMAdAB0AGEAcABzAC4AbgBlAHQALwBwAHIALwBzAHYAYwAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4AD8AUABsAGEAeQBSAGkAZwBoAHQAPQAxACYAYQBtAHAAOwBhAG0AcAA7AGEAbQBwADsAVQBzAGUAUwBpAG0AcABsAGUATgBvAG4AUABlAHIAcwBpAHMAdABlAG4AdABMAGkAYwBlAG4AcwBlAD0AMQA8AC8ATABBAF8AVQBSAEwAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==</speke:ProtectionHeader>
			<cpix:PSSH>AAADMHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAxAQAwAAAQABAAYDPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgBiAGgAdwBpAGUAWQAxAFcAdgBtADMARABqAGkANgBzAEEAdABLAFoAegBRAD0APQA8AC8ASwBJAEQAPgA8AEMASABFAEMASwBTAFUATQA+AGEAVABtAFAASgBWAEMAVgBaADYAcwA9ADwALwBDAEgARQBDAEsAUwBVAE0APgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAHAAcgBsAHMALgBhAHQAdgAtAHAAcwAuAGEAbQBhAHoAbwBuAC4AYwBvAG0ALwBjAGQAcAA8AC8ATABBAF8AVQBSAEwAPgA8AEMAVQBTAFQATwBNAEEAVABUAFIASQBCAFUAVABFAFMAPgA8AEkASQBTAF8ARABSAE0AXwBWAEUAUgBTAEkATwBOAD4ANwAuADEALgAxADQAMwA5AC4AMAA8AC8ASQBJAFMAXwBEAFIATQBfAFYARQBSAFMASQBPAE4APgA8AC8AQwBVAFMAVABPAE0AQQBUAFQAUgBJAEIAVQBUAEUAUwA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</cpix:PSSH>
		</cpix:DRMSystem>
	</cpix:DRMSystemList>
</cpix:CPIX>
```

# SPEKE API v1 - 内容密钥加密
<a name="content-key-encryption"></a>

您可以选择将内容密钥加密添加到 SPEKE 实现。内容密钥加密除了对内容本身进行加密外，还通过加密传输的内容密钥来确保全面 end-to-end保护。如果您未为密钥提供程序实现此项，则依靠传输层加密以及强大的身份验证来实现安全性。

要对在 AWS 云中运行的加密器使用内容密钥加密，客户需要将证书导入 AWS Certifice Manager，然后使用生成的证书 ARNs 进行加密活动。加密器使用证书 ARNs 和 ACM 服务向 DRM 密钥提供者提供加密的内容密钥。

**限制**  
SPEKE 支持具有以下限制的 DASH-IF CPIX 规范中指定的内容密钥加密：
+ SPEKE 不支持请求或响应负载的数字签名验证（XMLDSIG）。
+ SPEKE 需要基于 2048 位 RSA 的证书。

这些限制也在 [DASH-IF 规范的自定义项和约束](speke-constraints.md)中列出。

**实现内容密钥加密**  
要提供内容密钥加密，请在您的 DRM 密钥提供程序实现中包含以下内容：
+ 处理请求和响应负载中的 `<cpix:DeliveryDataList>` 元素。
+ 在响应负载的 `<cpix:ContentKeyList>` 中提供加密值。

有关这些元素的更多信息，请参阅 [DASH-IF CPIX 2.0 规范](https://dashif.org/docs/DASH-IF-CPIX-v2-0.pdf)。

 *请求负载中的示例内容密钥加密元素 ` <cpix:DeliveryDataList> `* 

下面的示例以粗体突出显示了增加的 `<cpix:DeliveryDataList>` 元素：

```
<?xml version="1.0" encoding="UTF-8"?>
<cpix:CPIX id="example-test-doc-encryption"
    xmlns:cpix="urn:dashif:org:cpix"
    xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
    xmlns:speke="urn:aws:amazon:com:speke">
    <cpix:DeliveryDataList>
        <cpix:DeliveryData id="<ORIGIN SERVER ID>">
            <cpix:DeliveryKey>
                <ds:X509Data>
                    <ds:X509Certificate><X.509 CERTIFICATE, BASE-64 ENCODED></ds:X509Certificate>
                </ds:X509Data>
            </cpix:DeliveryKey>
        </cpix:DeliveryData>
    </cpix:DeliveryDataList>
    <cpix:ContentKeyList>
     ...
    </cpix:ContentKeyList>
</cpix:CPIX>
```

 *响应负载中的示例内容密钥加密元素 ` <cpix:DeliveryDataList> `* 

下面的示例以粗体突出显示了增加的 `<cpix:DeliveryDataList>` 元素：

```
<cpix:CPIX xmlns:cpix="urn:dashif:org:cpix"
    xmlns:enc="http://www.w3.org/2001/04/xmlenc#"
    xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
    xmlns:speke="urn:aws:amazon:com:speke" id="hls_test_001">
    <cpix:DeliveryDataList>
        <cpix:DeliveryData id="<ORIGIN SERVER ID>">
            <cpix:DeliveryKey>
                <ds:X509Data>
                    <ds:X509Certificate><X.509 CERTIFICATE, BASE-64 ENCODED></ds:X509Certificate>
                </ds:X509Data>
            </cpix:DeliveryKey>
            <cpix:DocumentKey Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc">
                <cpix:Data>
                    <pskc:Secret>
                        <pskc:EncryptedValue>
                            <enc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p" />
                            <enc:CipherData>
                                <enc:CipherValue><RSA CIPHER VALUE></enc:CipherValue>
                            </enc:CipherData>
                        </pskc:EncryptedValue>
                        <pskc:ValueMAC>qnei/5TsfUwDu+8bhsZrLjDRDngvmnUZD2eva7SfXWw=</pskc:ValueMAC>
                    </pskc:Secret>
                </cpix:Data>
            </cpix:DocumentKey>
            <cpix:MACMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#hmac-sha512">
                <cpix:Key>
                    <pskc:EncryptedValue>
                        <enc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p" />
                        <enc:CipherData>
                            <enc:CipherValue><RSA CIPHER VALUE></enc:CipherValue>
                        </enc:CipherData>
                    </pskc:EncryptedValue>
                    <pskc:ValueMAC>DGqdpHUfFKxdsO9+EWrPjtdTCVfjPLwwtzEcFC/j0xY=</pskc:ValueMAC>
                </cpix:Key>
            </cpix:MACMethod>
        </cpix:DeliveryData>
    </cpix:DeliveryDataList>
    <cpix:ContentKeyList>
     ...
    </cpix:ContentKeyList>
</cpix:CPIX>
```

 *响应负载中的示例内容密钥加密元素 ` <cpix:ContentKeyList> `* 

下面的示例显示了在响应负载的 `<cpix:ContentKeyList>` 元素中的加密内容密钥处理。这将使用 `<pskc:EncryptedValue>` 元素：

```
   <cpix:ContentKeyList>
        <cpix:ContentKey kid="682681c8-69fa-4434-9f9f-1a7f5389ec02">
            <cpix:Data>
                <pskc:Secret>
                    <pskc:EncryptedValue>
                        <enc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" />
                        <enc:CipherData>
                            <enc:CipherValue>NJYebfvJ2TdMm3k6v+rLNVYb0NoTJoTLBBdbpe8nmilEfp82SKa7MkqTn2lmQBPB</enc:CipherValue>
                        </enc:CipherData>
                    </pskc:EncryptedValue>
                    <pskc:ValueMAC>t9lW4WCebfS1GP+dh0IicMs+2+jnrAmfDa4WU6VGHc4=</pskc:ValueMAC>
                </pskc:Secret>
            </cpix:Data>
        </cpix:ContentKey>
    </cpix:ContentKeyList>
```

相比而言，以下示例显示了类似的响应负载，其中包含以未加密的明文密钥形式提供的内容密钥。这将使用 `<pskc:PlainValue>` 元素：

```
    <cpix:ContentKeyList>
        <cpix:ContentKey explicitIV="OFj2IjCsPJFfMAxmQxLGPw==" kid="682681c8-69fa-4434-9f9f-1a7f5389ec02">
            <cpix:Data>
                <pskc:Secret>
                    <pskc:PlainValue>5dGAgwGuUYu4dHeHtNlxJw==</pskc:PlainValue>
                </pskc:Secret>
            </cpix:Data>
        </cpix:ContentKey>
    </cpix:ContentKeyList>
```

# SPEKE API v1 - 检测信号
<a name="heartbeat"></a>

 *请求语法示例* 

以下 URL 是一个示例，并且不指示固定格式：

```
GET https://speke-compatible-server/speke/v1.0/heartbeat
```

 *请求响应* 


| HTTP 代码 | 负载名称 | 发生次数 | 说明 | 
| --- | --- | --- | --- | 
|   `200 (Success)`   |  statusMessage  |  1..1  |  描述状态的消息  | 

# SPEKE API v1 - 覆盖密钥标识符
<a name="kid-override"></a>

每轮换一次密钥，加密程序就会创建一个新的密钥标识符 (KID)。它将 KID 传递到其请求中的 DRM 密钥提供程序。通常，使用相同 KID 的密钥提供程序会响应，但它可以在响应中提供其他 KID 值。

以下是 KID 为 `11111111-1111-1111-1111-111111111111` 的示例请求：

```
    <cpix:CPIX id="abc123" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" xmlns:speke="urn:aws:amazon:com:speke">
      <cpix:ContentKeyList>
       <cpix:ContentKey kid="11111111-1111-1111-1111-111111111111"></cpix:ContentKey>
      </cpix:ContentKeyList>
      <cpix:DRMSystemList>
       <!-- Common encryption (Widevine)-->
       <cpix:DRMSystem kid="11111111-1111-1111-1111-111111111111" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
        <cpix:PSSH />
       </cpix:DRMSystem>
      </cpix:DRMSystemList>
      <cpix:ContentKeyPeriodList>
       <cpix:ContentKeyPeriod id="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f" index="1" />
      </cpix:ContentKeyPeriodList>
      <cpix:ContentKeyUsageRuleList>
       <cpix:ContentKeyUsageRule kid="11111111-1111-1111-1111-111111111111">
        <cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f" />
       </cpix:ContentKeyUsageRule>
      </cpix:ContentKeyUsageRuleList>
     </cpix:CPIX>
```

以下响应将 KID 覆盖为 `22222222-2222-2222-2222-222222222222`：

```
     <cpix:CPIX xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" xmlns:speke="urn:aws:amazon:com:speke" id="abc123">
      <cpix:ContentKeyList>
       <cpix:ContentKey explicitIV="ASgwx9pQ2/2lnDzJsUxWcQ==" kid="22222222-2222-2222-2222-222222222222">
        <cpix:Data>
         <pskc:Secret>
          <pskc:PlainValue>p3dWaHARtL97MpT7TE916w==</pskc:PlainValue>
         </pskc:Secret>
        </cpix:Data>
       </cpix:ContentKey>
      </cpix:ContentKeyList>
      <cpix:DRMSystemList>
       <cpix:DRMSystem kid="22222222-2222-2222-2222-222222222222" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
        <cpix:PSSH>AAAAanBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAEoIARIQeSIcblaNbb7Dji6sAtKZzRoNd2lkZXZpbmVfdGVzdCIfa2V5LWlkOmVTSWNibGFOYmI3RGppNnNBdEtaelE9PSoCU0QyAA==</cpix:PSSH>
       </cpix:DRMSystem>
      </cpix:DRMSystemList>
      <cpix:ContentKeyPeriodList>
       <cpix:ContentKeyPeriod id="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f" index="1" />
      </cpix:ContentKeyPeriodList>
      <cpix:ContentKeyUsageRuleList>
       <cpix:ContentKeyUsageRule kid="22222222-2222-2222-2222-222222222222">
        <cpix:KeyPeriodFilter periodId="keyPeriod_0909829f-40ff-4625-90fa-75da3e53278f" />
       </cpix:ContentKeyUsageRule>
      </cpix:ContentKeyUsageRuleList>
     </cpix:CPIX>
```