# Tencent Cloud COS 配置教程 使用限定权限的 CAM 凭据、浏览器 CORS 和加密媒体分发,将 Tencent Cloud COS 连接到 DRM-X 6.0,并验证上传和播放。 **将 Tencent Cloud COS 连接到 DRM-X 6.0。**创建专用存储桶,为程序子用户授予加密内容的访问权限,配置 CORS 和 HTTPS 分发,然后验证上传和受保护播放。 截图使用腾讯云中文控制台,配置与 DRM-X 实测流程一致。账号信息已排除;连接表单使用示例标识,凭据字段保持空白。请结合每张图下方的说明操作,并替换为您自己的配置值。 ## 1. 创建 COS 存储桶[#](#create-bucket) - 打开腾讯云控制台 → 对象存储 COS。如果尚未开通 COS,请阅读计费条款后开通。存储容量优惠不代表请求次数和出网流量也免费。 - 选择**创建存储桶**,输入唯一名称,并选择适合分发源站的地域。记录完整桶名(含数字 APPID 后缀)和地域代码,例如 `ap-hongkong`。 - 选择**私有读写**。经常播放的内容使用标准存储。本教程使用一个专用桶,并将 DRM 加密输出放在 `protected/` 目录中。原始视频和其他私有文件应存放在别处。 ![COS 已选择私有读写权限](https://docs.drm-x.com/assets/storage/tencent/bucket-private.jpg)选择**私有读写**。保持存储桶为私有;第 4 步只为加密媒体目录授予读取权限。 ## 2. 创建限定权限的程序凭据[#](#access-key) 在**访问管理 CAM → 用户**中创建专用子用户,启用**编程访问**,无需开启控制台登录。完成腾讯云安全验证后,仅授予此连接需要的桶和对象操作权限。妥善保存 `SecretId` 和 `SecretKey`,仅在已登录的 DRM-X 云存储表单中填写。 ![CAM 已勾选编程访问,未勾选控制台访问](https://docs.drm-x.com/assets/storage/tencent/cam-access.jpg)勾选**编程访问**。此存储专用子用户不需要勾选**腾讯云控制台访问**。 在**访问管理 CAM → 策略 → 新建自定义策略**中,使用 JSON 编辑器填写下方策略,然后将此自定义策略关联到专用子用户。实测通过的 COS 资源语法为 `qcs::cos:REGION:uid/APPID:BUCKET-APPID/...`;请使用 `uid/`,不要使用 `appid/`,并填写桶所属账号的数字 APPID。 可使用以下自定义 CAM 策略作为起点。请将 `REGION`、`APPID` 和 `BUCKET-APPID` 替换为自己的值。列出桶内对象的权限用于连接验证和文件浏览;对象操作限制在 `protected/*` 内,用于上传、元数据检查、复制、重命名和删除。COS 使用源对象的 GetObject 权限及目标对象的 PutObject 权限来授权复制操作。 ``` { "version": "2.0", "statement": [ { "effect": "allow", "action": ["cos:GetBucket", "cos:HeadBucket"], "resource": ["qcs::cos:REGION:uid/APPID:BUCKET-APPID/*"] }, { "effect": "allow", "action": ["cos:GetObject", "cos:HeadObject", "cos:PutObject", "cos:DeleteObject"], "resource": ["qcs::cos:REGION:uid/APPID:BUCKET-APPID/protected/*"] } ] } ``` 不要使用主账号密钥,也不要关联可管理整个账号的管理员策略。不要将密钥对放入源代码、截图、播放器页面或支持日志中。 ## 3. 配置浏览器 CORS[#](#cors) 打开存储桶 → **安全管理 → 跨域访问 CORS 设置 → 添加规则**。每行填写一个来源或请求头。以下值用于 DRM-X Console 和在线测试播放器;集成自己的播放器网站时,请加入该网站的 HTTPS 来源。 | 字段 | 值 | | --- | --- | | 来源 Origin | `https://6.drm-x.com https://multi-drm.drm-x.com https://developer.drm-x.com` | | 操作 Methods | `PUT, GET, HEAD` | | Allow-Headers | `*` | | Expose-Headers | `ETag Content-Length Content-Range Accept-Ranges x-cos-request-id` | | Max-Age | `600` | | Vary: Origin | 已开启 | ![已保存的 COS CORS 来源、方法、请求头和缓存设置](https://docs.drm-x.com/assets/storage/tencent/cors.jpg)保存后,检查三个来源、**PUT / GET / HEAD**、允许的请求头 `*`、五个暴露的响应头、**600** 秒缓存,以及**已开启 Vary**。图中是上传和播放测试实际使用的已保存规则。 来源包含协议和主机名,不包含页面路径或末尾斜杠。上面的通配符允许请求头(包括签名上传使用的元数据),并非允许任意网站。CORS 不授予对象访问权限,也不能代替 CAM 策略或桶策略。 ## 4. 配置加密媒体分发[#](#delivery) 保持桶的基础权限为私有。在**权限管理 → Policy 权限设置 → 添加策略**中,仅允许匿名用户对 `protected/*` 执行 `GetObject`、`HeadObject` 和 `OptionsObject`。不要开放公开上传、删除或桶列表权限。匿名用户只能读取加密字节;正确打包加密的媒体仍需有效 DRM 许可证才能解密。 选择**所有用户(可匿名访问)**、**指定目录**和自定义策略。在下一页保持**允许**,资源路径填写 `protected/*`,只添加下图中的三个操作。检查授权范围后,再选择**完成**。 ![匿名分发仅选择 GetObject、HeadObject 和 OptionsObject](https://docs.drm-x.com/assets/storage/tencent/public-read.jpg)公开分发策略只包含这三个操作:`GetObject`、`HeadObject` 和 `OptionsObject`。上传权限由第 2 步的身份认证 CAM 策略单独授予。 使用指向此桶的 HTTPS 分发源站。默认源站格式为 `https://BUCKET-APPID.cos.REGION.myqcloud.com`。腾讯云会限制较新存储桶使用默认域名在浏览器中预览。请检查实际播放清单和分片响应;用于生产分发时,应按腾讯云域名指南配置自己的 HTTPS 源站或 CDN 域名及证书。 使用 CDN 时,保留对象路径,并为相同的播放器来源配置 CORS 响应。转发或正确处理 `Range` 请求。仅配置 DNS CNAME 并不能完成 HTTPS 证书或源站访问配置。 ## 5. 在 DRM-X 中连接存储桶[#](#connect) 打开[云存储 → 连接存储](https://6.drm-x.com/console/cloud-storage),选择 **Tencent Cloud COS**,然后填写以下字段。 | DRM-X 字段 | 示例或来源 | | --- | --- | | 显示名称 | `Tencent COS` | | 存储桶名称 | `BUCKET-APPID` | | 地域 | `ap-hongkong` | | 受保护内容基础路径 | `protected` | | 公开 URL 前缀 | `https://media.example.com/protected` | | `SecretId / SecretKey` | 专用 CAM 子用户的密钥对 | 在对象键和分发 URL 中分别包含一次 `protected`。例如,对象 `protected/video/dash-cenc/manifest.mpd` 必须能够通过 `https://media.example.com/protected/video/dash-cenc/manifest.mpd` 访问。公开 URL 字段应填写稳定的分发前缀,不应填写临时签名 URL 或地域级 S3 API 地址。 ![DRM-X 腾讯云 COS 连接字段,桶名与分发 URL 均为示例](https://docs.drm-x.com/assets/storage/tencent/drmx-connect.jpg)选择 **Tencent Cloud COS**,填写包含 APPID 的完整桶名,并使用与桶一致的地域。图中示例使用 `ap-hongkong` 和 `protected`。请将 `https://media.example.com/protected` 替换为实际的 HTTPS 分发前缀。 选中**设为 CLI 默认上传目标**,使新建的 Packager 任务使用 COS,然后选择**保存并验证**。已有加密输出包仍使用原来的目标。即使已取消 1AICLOUD,客户自己连接且处于有效、已验证状态的云存储仍可使用。 ![DRM-X 凭据字段、默认上传复选框及保存并验证按钮](https://docs.drm-x.com/assets/storage/tencent/drmx-default.jpg)在这里填写专用子用户的 `SecretId` 和 `SecretKey`;截图中这两个字段有意留空。勾选**设为 CLI 默认上传目标**,然后选择**保存并验证**。 ## 6. 测试上传和受保护播放[#](#verify) - 确认连接显示为已验证。这只检查服务器能否列出桶内对象,并不证明浏览器具有上传权限或能够公开播放。 - 在云存储页面上传一个 DRM-X 加密输出包中的小型加密文件。确认 DRM-X 和 COS 中均显示该文件名及大小。这一步验证浏览器 CORS 和签名 PUT 请求。 - 新建 Packager 任务并启用云上传。检查预检输出是否显示 Tencent Cloud COS 及目标桶,然后完成加密、上传和发布。 - 在未登录云控制台的情况下检查已发布的播放清单和分片。GET/HEAD 应成功,受支持的字节范围请求应返回 `206 Partial Content`。 - 在 DRM-X 开发者工具中选择新的 Content ID 及其 COS 发布版本,签发临时 DRM License Token,然后打开 Universal Player。确认视频和音频实际播放、时间前进且可以跳转。不要分享令牌,也不要仅因播放清单可下载就认定播放成功。 如果 Edge 播放可能使用 PlayReady,请选择 Packager 的最大兼容输出,使输出包同时包含 `dash-cenc` 和 `cmaf-cbcs` 播放清单。设备可能支持 PlayReady/CENC,但不支持 PlayReady/CBCS;应测试合适的播放清单,不要将这种兼容性差异误判为存储故障。 2026 年 11 月 4 日已完成验证:两个短视频加密输出包成功上传到 COS;播放清单与分片读取、字节范围响应、CORS 限制、Edge 中的 Widevine/CBCS 播放,以及 PlayReady/CENC 播放和跳转均通过。此次完成的测试不包含浏览器选文件上传;正式使用浏览器上传前,请在自己的浏览器中执行第 6.2 步。 ## 故障排查[#](#troubleshooting) - **连接验证被拒绝:**检查完整桶名、地域、密钥对和 `GetBucket` 权限。资源标识中应使用此桶所属账号的 APPID。 - **浏览器上传失败:**检查是否允许 `https://6.drm-x.com` 发起 PUT 跨域请求、是否允许所需请求头,以及对象写入权限。重试以获取新的签名 URL。 - **上传成功但播放失败:**检查分发前缀、匿名或 CDN 读取权限、播放清单与分片 URL、HTTPS 证书、CORS 和 Range 响应,再单独查看播放器的 DRM 许可证错误。 - **Packager 仍显示 1AICLOUD:**将 COS 设为默认目标后新建任务。恢复旧任务时,会继续使用该加密输出包已记录的目标。 ## 腾讯云参考文档[#](#references) - [S3 兼容性](https://intl.cloud.tencent.com/document/product/436/34688?lang=en) - [CAM 子用户和访问密钥](https://cloud.tencent.com/document/product/436/11714) - [COS CORS 配置](https://cloud.tencent.com/document/product/436/13318) - [桶策略示例](https://intl.cloud.tencent.com/zh/document/product/436/30581)