火山引擎视频直播提供基于 Fairplay 的 DRM (Digital Rights Management,数字版权管理)加密协议的视频直播加密服务,本文主要介绍如何通过视频直播提供的 DRM 加密功能实现在 iOS 平台直播流的加密和解密。
火山引擎视频直播当前只支持提供 HLS 协议的加密视频播放地址。
火山引擎视频直播只提供对视频流的加密操作,DRM 加密的证书管理由第三方服务商 Intertrust 提供。
说明
使用 Intertrust 的 DRM 加密证书管理会产生费用,您可以直接对接 Intertrust 商务或通过创建工单联系火山引擎视频直播技术支持获取更多帮助。
登录 Intertrust 控制台。
在左侧导航栏选择 Manage Account,选择 Subscriptions 页签。
开启您需要使用的 DRM 加密协议。
在左侧导航栏选择 Api Keys / Cust. Auth., 单击 Add Api Key / Cust. Auth. 按钮创建一个访问密钥,记录此访问密钥。
由于 Apple 公司的要求,使用基于 Fairplay 的 DRM 加密协议需要向其申请相关证书信息。
申请 FairPlay 相关过程中您会获得如下文件或信息,请妥善保存用于后续配置。
打开Apple Fairplay官网,单击网站底部的 Request FPS Deployment Package,并使用您的开发者账号进行登录。
根据页面提示填写申请部署包的表单,在 Apple 确认后,您将收到一个包含创建 FPS 凭证说明文档的文件(FPS_Deployment_Package.zip),下载到本地并解压。
根据解压后文档中的提示,在本地创建私钥文件(privatekey.pem)和并记录创建过程中定义的私钥密码。
根据解压后文档中的提示,创建证书签名请求文件(certreq.csr)。
根据解压后文档中的提示,在 Apple 创建 FairPlay 证书,创建过程中需上传证书签名请求文件(certreq.csr)并返回 ASK (Application Secret Key)字符串,妥善保存 ASK 字符串。证书创建成功后将此证书文件(fairplay.cer)下载到本地备用。
登录 Intertrust 控制台。
在左侧导航栏选择Subscriptions > FairPlay。
单击 Click here if you would like to update your FairPlay Key/Certificate 配置 FairPlay 证书信息。
配置项 | 说明 |
---|---|
FairPlay Access Secret Key | 申请证书文件过程中 Apple 返回的 ASK。 |
FairPlay PKCS12 Certificate | 获取到的 FairPlay 证书文件(fairplay.cer) |
Certificate password | 本地创建私钥文件时指定的私钥密码。 |
登录视频直播控制台。
左侧导航栏选择功能管理 > 加密管理,选择 DRM 页签。
在证书管理配置模块,单击编辑配置,在弹出的对话框中设置相关参数。配置参数除证书名称外,均在申请证书时获取。
配置项 | 说明 |
---|---|
证书名称 | 自定义证书名称,支持由小写字母、数字和短横线(-)组成,最小长度为 2个字符,最大长度为 128 个字符。 |
证书文件 | 获取到的 FairPlay 证书文件(fairplay.cer)。 |
私钥文件 | 本地创建的私钥文件(privatekey.pem)。 |
私钥密钥 | 本地创建私钥文件时指定的私钥密码。 |
ASK | 应用程序密钥,在申请证书文件过程中 Apple 会返回此值。 |
本章节介绍如何为需要进行 DRM 加密的直播流和转码流添加加密配置。
登录视频直播控制台。
添加转码配置。
左侧导航栏选择功能配置,选择转码配置页签。
单击添加配置,为直播流添加转码配置如下。
添加 DRM 加密配置。
左侧导航栏选择功能配置,选择 加密配置页签。
单击添加配置,为直播流的转码流添加 DRM 加密配置如下。
登录视频直播控制台。
左侧导航栏选择直播工具 > 地址生成器,为配置了 DRM 加密的直播转码流生成拉流地址。
注意
为了有授权的用户可以观看加密的直播流,播放器需要调用视频直播的 OpenAPI 校验 DRM 授权许可。使用 FairPlay 加密技术时,需额外校验 FairPlay 证书。
视频直播提供以下接口供您调用获取校验信息:
由于访问 OpenAPI 接口需使用到的 AK/SK 无法存储在客户端设备上,因此需要先在服务端通过 AK/SK 生成签名信息,再将签名信息传递到客户端设备。生成签名信息请参见签名方法。
假设您使用 Go SDK 调用视频直播 OpenAPI。使用以下代码生成查询 URL,以便客户端检索 DRM 许可证和 FairPlay 证书。
定义获取授权文件和证书的业务参数:
var ( serviceInfo = &ServiceInfo{ Timeout: 5 * time.Second, Host: "live.volcengineapi.com", Header: http.Header{ "Accept": []string{"application/json"}, }, Credentials: Credentials{Region: cn-north-1, Service: "live"}, } // DescribeLicenseDRM 用于设置获取 DRM 授权许可文件 URL 的参数 // DescribeCertDRM 用于设置获取 FairPlay 证书文件 URL 的参数 apiList = map[string]*ApiInfo{ "DescribeLicenseDRM": { Method: http.MethodPost, Path: "/", Query: url.Values{ "Action": []string{"DescribeLicenseDRM"}, "Version": []string{"2023-01-01"}, "Vhost": []string{"push.example.com"}, "Domain": []string{"pull.example.com"}, "App": []string{"drm-test"}, "StreamName": []string{"s-drm-1221"}, "DRMType": []string{"fp"}, // DRM 加密类型,fp 表示 FairPlay }, }, "DescribeCertDRM": { Method: http.MethodGet, Path: "/", Query: url.Values{ "Action": []string{"DescribeCertDRM"}, "Version": []string{"2023-01-01"}, "Vhost": []string{"push.example.com"}, "App": []string{"drm-test"}, }, }, } )
执行以下示例代码,生成查询 DRM 许可授权文件的 URL 地址和查询 FairPlay 证书的 URL 地址。
func TestClient_GetSignUrl(t *testing.T) { client := NewClient(serviceInfo, apiList) client.SetAccessKey("your ak") client.SetSecretKey("your sk") urlStr, _ := client.GetSignUrl("DescribeLicenseDRM", nil) fmt.Println("https://live-gateway.zijieapi.com/drm_api/?" + urlStr) urlStr, _ = client.GetSignUrl("DescribeCertDRM", nil) fmt.Println("https://live-gateway.zijieapi.com/drm_api/?" + urlStr) }
在客户端创建播放器并进行授权校验。
Web 端:使用 Web 拉流 SDK 实现在 iOS 平台播放 DRM 加密流的代码示例如下。
VePlayer.createLivePlayer({ url: 'https://xxx.m3u8', height: 360, drm: { fairplay: { getDrmConfig: async ({url}) => { return { // FairPlay 证书查询地址 URL serverCertificatePath: 'https://xxx', // DRM 授权许可查询地址 URL serverProcessSPCPath: 'https://xxx', } }, }, }, }).then(function (veplayer) { veplayer.on('error', function (error) { // 错误代码 7100 表示授权校验失败,请检查获取 DRM 许可证书和 FairPlay 证书的 URL 是否有效 console.log(error.errorCode); }); });
iOS 端:使用 iOS 拉流 SDK 实现在 iOS 平台播放 DRM 加密流,代码示例如下。
初始化播放器。
self.livePlayer = [[TVLManager alloc] initWithType:VeLivePlayerTypeSystem];
配置加密流播放地址。
NSString *playUrl = "http://pull.example.com/live/stream.m3u8"; [self.livePlayer setPlayUrl:playUrl];
注册 observer 后,通过以下回调方法返回 Fairplay 证书文件和 DRM 授权许可 URL。
- (NSData *)getDrmResourceLoaderCertificateData:(TVLManager *)player { // 传入 Fairplay 证书的路径 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"testfairplay" ofType:@"cer"]; NSData *certificate = [NSData dataWithContentsOfFile:filePath]; return certificate; } - (NSString *)getDrmResourceLoaderLicenseUrl:(TVLManager *)player { // 返回 DRM 许可证书地址 URL return @"https://drmtest/license"; }
调用 play 方法播放 DRM 加密流。
[self.livePlayer play];