如需创建签名请求,请编写一个字符串,在其中包含描述要保护的内容以及签名值的到期时间的参数。然后,在请求中包含组合的字符串。 然后,媒体 CDN 会先验证您的签名请求是否有效,然后再对其执行操作。
签名请求要求
签名请求必须满足以下要求:
具有
GET
、HEAD
或OPTIONS
HTTP 方法。其他方法不受支持。将到期时间设置为将来的时间。由于可能存在时钟同步差异和客户端网络条件(例如,断开连接和重试),我们建议将时间戳设置为未来 1 分钟内或不小于视频串流长度(以较大者为准)。
具有可通过
EdgeCacheKeyset
中的密钥或密钥验证的签名。
您无法对其他 HTTP 方法(例如 POST
、PUT
或 DELETE
请求)进行签名。如果您需要发出签名网址以向用户上传内容,请参阅签名网址的 Cloud Storage 文档。
安全注意事项
媒体 CDN 会验证与 cdnPolicy.signedRequestMode
为 REQUIRE_SIGNATURES
或 REQUIRE_TOKENS
的路由匹配的所有请求。
下表介绍了媒体 CDN 验证请求的场景:
请求具有签名 | 签名是否有效? | signedRequestMode | 行为 | 响应代码 |
---|---|---|---|---|
否 | 不适用 | REQUIRE_SIGNATURES 或 REQUIRE_TOKENS |
没有签名或令牌的请求将被视为无效。 | HTTP 403 |
是 | 否 | REQUIRE_SIGNATURES 或 REQUIRE_TOKENS |
如果签名或令牌已过期或者包含不匹配的网址或密钥不正确,则会被视为无效。无效的签名或令牌在 CDN 边缘会被拒绝。 | HTTP 403 |
是 | 是 | REQUIRE_SIGNATURES 或 REQUIRE_TOKENS |
使用来自缓存的内容或从源站提取的内容验证签名或令牌和响应。 | HTTP 200 |
是 | 是 | 无或 DISABLED |
不会执行验证,而是直接向用户提供响应。 | HTTP 200 |
是 | 否 | 无或 DISABLED |
不会执行验证,而是直接向用户提供响应。 | HTTP 200 |
当您的应用检测到无效签名时,请确保其使用 HTTP 403 (Forbidden)
响应代码来作出响应。HTTP 403
响应代码不可缓存。
配置签名请求
以下部分详细介绍了如何配置、签署和验证已签名的请求。
生成密钥
创建密钥集
要求签名请求
如需仅允许签名请求访问资源,可以将密钥列表附加到路由,并将 signedRequestMode
设置为以下其中一项:
REQUIRE_SIGNATURES
(适用于未使用令牌的签名请求)。REQUIRE_TOKENS
(适用于使用令牌的签名请求)。
在路由上启用签名请求会强制对所有请求进行签名或提供令牌。没有有效签名(例如密钥名称无效、签名或令牌过期、签名不匹配等)的请求会失败。
EdgeCacheKeyset
可以包含多个密钥,以允许密钥轮替。系统会接受使用任何列出的密钥进行签名的有效请求,并按顺序尝试密钥。如需详细了解密钥轮替,请参阅轮替密钥。
当 signedRequestMode
设置为 REQUIRE_SIGNATURES
或 REQUIRE_TOKENS
时,媒体 CDN 会验证缓存命中和未命中。这包括对源站的所有请求。
以下是对给定 PathMatcher(路由)强制执行签名请求的媒体 CDN 配置的示例:
gcloud edge-cache services describe prod-media-service输出:
... routeAction: cdnPolicy: cacheMode: CACHE_ALL_STATIC signedRequestMode: REQUIRE_SIGNATURES signedRequestKeyset: prod-vod-keyset
如需了解如何为签名请求创建令牌,请参阅生成令牌。
如需停用请求签名,您可以将 signedRequestMode
设置为 DISABLED
并删除对 signedRequestKeyset
的引用。
在源站验证请求
如果为路由配置了签名模式 REQUIRE_SIGNATURES
,媒体 CDN 会验证每个匹配的请求是否具有有效的签名。对于这些路由,缺少签名会被视为无效签名。
为防止出现签名配置错误以及用户尝试直接访问您的源站的情况,我们建议您也验证是否已在源站对请求进行了签名。内容保护深度防御方法有助于防止他人在未经授权的情况下访问和下载您的许可内容和付费内容。
对于基于网址的签名方法(其中签名是查询参数的一部分或作为网址路径组成部分嵌入),签名和相关参数会在请求发送到来源之前从网址中移除。这样可以防止签名在源站处理请求时导致路由问题。如需验证这些请求,您可以在移除已签名的组件之前检查 x-client-request-url
请求标头,其中包含原始(已签名的)客户端请求网址。
如需在源站验证请求,请在请求签名端点中使用相同的验证代码,这也有助于减少因密钥轮替而导致的密钥不匹配和问题。
轮替密钥
最佳做法是定期轮替或更新媒体 CDN 使用的 Secret。我们建议每 30 到 60 天轮替一次密钥,但并非严格要求。