Widevine 与无头浏览器:DRM 能力边界排障清单
用可复现实测矩阵区分无头显示限制、CDM 可用性、鲁棒级别和许可证决策,并记录安全回退路径。
BotBrowser Team
BotBrowser 可以在声明过的 profile 中重复已授权的 DRM 夹具,但不能提供 proprietary CDM、授予许可证,或把无头模式变成硬件安全显示。这篇文章与自动化浏览器中的 Widevine CDM 可用性不同:后者只验证第一次 EME 能力请求,这篇文章把显示、模块、鲁棒级别和许可证决策分开。
BotBrowser 支持在受控 profile 中重复这些能力检查,但不能提供 CDM、改变许可证服务的决定或保证硬件安全输出。
要点
“无头 DRM 失败”不是一种诊断。页面可能在选择 CDM 前失败,也可能只支持软件鲁棒级别、输出路径受限,或许可证服务拒绝请求。每次运行都记录浏览器版本、profile、显示模式和供应商状态码。
目录
四个需要分别验证的边界
第一是密钥系统可用性。requestMediaKeySystemAccess() 可能在联系许可证地址前就拒绝。先使用Widevine CDM 可用性探针,并把结果标成“模块协商”,不要写成“播放成功”。
第二是鲁棒级别。默认请求成功不代表 HW_SECURE_ALL 可用;桌面或虚拟显示往往只暴露软件级别。记录实际接受的字符串,不要把它简化成是/否。
第三是输出保护。播放开始后仍可能因为显示路径不满足保护要求而变成 output-restricted。无头和有头只是测试模式,不是安全级别;应使用相同 profile 和 codec 对比。
第四是许可证策略。挑战生成后仍可能收到 HTTP 错误、账号拒绝、地区限制或过期 entitlement。日志只保存状态码和供应商错误码,不保存 license message、cookie 或 token。
可复现的矩阵
让同一个 HTTPS 夹具在每行使用一个新 profile:
| 行 | 变化 | 观察 | 含义 |
|---|---|---|---|
| A | 无头,默认能力请求 | 成功或 NotSupportedError | 模块协商 |
| B | 有头,相同 profile | 与 A 对比 | 显示模式对照 |
| C | 依次请求 SW_SECURE_DECODE、HW_SECURE_ALL | 可能一项成功、一项拒绝 | 鲁棒级别 |
| D | 用获授权的测试服务处理 challenge | HTTP 状态和供应商码 | 许可证策略 |
| E | 虚拟显示/输出夹具 | output-restricted 或回退 UI | 输出保护 |
保存类似 {"build":"Chrome 155.0.8059.80","mode":"headless","profile":"fresh-temporary","robustness":"SW_SECURE_DECODE","access":"supported","licenseStatus":null} 的 JSON。它是实测产物,不是所有标题和主机都相同的保证。
如何读取失败
所有 key-system 都拒绝时,先比较浏览器二进制和启动参数,再查许可证服务器。软件级别成功而硬件级别失败时,应降低测试期望或记录供应商要求,不要称浏览器损坏。能力请求成功而许可证失败时,检查测试资产的 HTTP 状态、entitlement 和地区。播放后停止时,记录 keystatuseschange 和输出路径。
不要复制别的机器的 CDM,也不要为了通过测试关闭安全开关。关于 profile 一致性,参阅无头与有头浏览器 profile 一致性;关于配置边界,参阅BotBrowser Widevine DRM 设置。
BotBrowser 能控制什么
当构建和 entitlement 支持时,BotBrowser 可以让声明的 profile 与每上下文的 --bot-widevine 策略保持一致。策略可以用来测试正常 challenge、阻止 challenge 或 no-CDM 回退,但不能制造 CDM、改变供应商账号决定、保证硬件安全,也不能保证每台主机都能播放受保护标题。
结论
无头只是显示模式。把可用性、鲁棒级别、输出保护和许可证策略拆成四行矩阵,DRM 排障才可行动。浏览器、框架、profile 或显示环境变化后重跑夹具,并保留实测结果。