You need to enable JavaScript to run this app.
导航
直播 DRM 加密
最近更新时间:2024.09.25 14:26:04首次发布时间:2024.03.19 15:00:34

火山引擎视频直播提供基于 Fairplay 的 DRM (Digital Rights Management,数字版权管理)加密协议的视频直播加密服务,本文主要介绍如何通过视频直播提供的 DRM 加密功能实现在 iOS 平台直播流的加密和解密。

使用限制

火山引擎视频直播当前只支持提供 HLS 协议的加密视频播放地址。

操作步骤

在 Intertrust 平台创建访问密钥

火山引擎视频直播只提供对视频流的加密操作,DRM 加密的证书管理由第三方服务商 Intertrust 提供。

说明

使用 Intertrust 的 DRM 加密证书管理会产生费用,您可以直接对接 Intertrust 商务或通过创建工单联系火山引擎视频直播技术支持获取更多帮助。

  1. 登录 Intertrust 控制台

  2. 在左侧导航栏选择 Manage Account,选择 Subscriptions 页签。

  3. 开启您需要使用的 DRM 加密协议。

  4. 在左侧导航栏选择 Api Keys / Cust. Auth., 单击 Add Api Key / Cust. Auth. 按钮创建一个访问密钥,记录此访问密钥。

在视频直播控制台中配置 Intertrust 访问密钥

  1. 登录视频直播控制台

  2. 左侧导航栏选择功能管理 > 加密管理,选择 DRM 页签。

  3. API Key 信息配置模块,单击编辑配置,在弹出的 API Key 信息对话框中填写在上一步中获取的访问密钥。

在 Apple 官网获取 FairPlay 证书

由于 Apple 公司的要求,使用基于 Fairplay 的 DRM 加密协议需要向其申请相关证书信息。

申请 FairPlay 相关过程中您会获得如下文件或信息,请妥善保存用于后续配置。

  • 私钥文件(.pem)
  • 私钥密码(自定义)
  • 应用密钥(ASK 字符串)
  • FairPlay 证书文件(.der或.cer)
  1. 打开Apple Fairplay官网,单击网站底部的 Request FPS Deployment Package,并使用您的开发者账号进行登录。

  2. 根据页面提示填写申请部署包的表单,在 Apple 确认后,您将收到一个包含创建 FPS 凭证说明文档的文件(FPS_Deployment_Package.zip),下载到本地并解压。

  3. 根据解压后文档中的提示,在本地创建私钥文件(privatekey.pem)和并记录创建过程中定义的私钥密码。

  4. 根据解压后文档中的提示,创建证书签名请求文件(certreq.csr)。

  5. 根据解压后文档中的提示,在 Apple 创建 FairPlay 证书,创建过程中需上传证书签名请求文件(certreq.csr)并返回 ASK (Application Secret Key)字符串,妥善保存 ASK 字符串。证书创建成功后将此证书文件(fairplay.cer)下载到本地备用。

在 Intertrust 平台配置 FairPlay 证书

  1. 登录 Intertrust 控制台

  2. 在左侧导航栏选择Subscriptions > FairPlay

  3. 单击 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本地创建私钥文件时指定的私钥密码。

在视频直播控制台配置 FairPlay 证书

  1. 登录视频直播控制台

  2. 左侧导航栏选择功能管理 > 加密管理,选择 DRM 页签。

  3. 证书管理配置模块,单击编辑配置,在弹出的对话框中设置相关参数。配置参数除证书名称外,均在申请证书时获取。

    配置项说明
    证书名称自定义证书名称,支持由小写字母、数字和短横线(-)组成,最小长度为 2个字符,最大长度为 128 个字符。
    证书文件获取到的 FairPlay 证书文件(fairplay.cer)。
    私钥文件本地创建的私钥文件(privatekey.pem)。
    私钥密钥本地创建私钥文件时指定的私钥密码。
    ASK应用程序密钥,在申请证书文件过程中 Apple 会返回此值。

在视频直播控制台创建 DRM 加密配置

本章节介绍如何为需要进行 DRM 加密的直播流和转码流添加加密配置。

  1. 登录视频直播控制台

  2. 添加转码配置。

    1. 左侧导航栏选择功能配置,选择转码配置页签。

    2. 单击添加配置,为直播流添加转码配置如下。

  3. 添加 DRM 加密配置。

    1. 左侧导航栏选择功能配置,选择 加密配置页签。

    2. 单击添加配置,为直播流的转码流添加 DRM 加密配置如下。

在视频直播控制台生成加密后拉流地址

  1. 登录视频直播控制台

  2. 左侧导航栏选择直播工具 > 地址生成器,为配置了 DRM 加密的直播转码流生成拉流地址。

注意

  • 除 HLS 拉流地址(M3U8 地址)外其余格式地址未进行 DRM 加密,请勿对外分发未加密的地址。
  • 为了防止未加密的地址被访问,您可以对拉流域名开启 URL 鉴权。

在客户端实现对加密流的解密播放

为了有授权的用户可以观看加密的直播流,播放器需要调用视频直播的 OpenAPI 校验 DRM 授权许可。使用 FairPlay 加密技术时,需额外校验 FairPlay 证书

视频直播提供以下接口供您调用获取校验信息:

在客户服务端生成校验授权的 URL 代码示例

由于访问 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 加密流,代码示例如下。

    1. 初始化播放器。

      self.livePlayer = [[TVLManager alloc] initWithType:VeLivePlayerTypeSystem];
      
      
    2. 配置加密流播放地址。

      NSString *playUrl = "http://pull.example.com/live/stream.m3u8";
      [self.livePlayer setPlayUrl:playUrl];
      
      
    3. 注册 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"; 
      }
      
    4. 调用 play 方法播放 DRM 加密流。

      [self.livePlayer play];