HLS标准加密采用AES_128算法,能够适配所有HLS播放器,并需结合密钥管理与令牌服务,广泛应用于在线教育、独播剧等高安全需求领域。本文将介绍视频的HLS加密与解密播放方法。
工作原理
视频点播采用信封加密技术,业务方通过阿里云KMS生成数据密钥(DK)和信封密钥(EDK);使用DK加密视频后,同时存储加密视频和(EDK)。终端播放时通过解密服务获取(DK)进行视频解密播放。
如果您需要对解密地址进行安全验证,可以通过开启M3U8标准加密改写(默认改写参数名为MtsHlsUriToken
)实现对HLS数据访问过程的再次加密保护。M3U8标准加密改写的开启方式及技术原理请参见配置M3U8标准加密改写。
前提条件
加密及解密流程
上传及加密流程
解密播放流程
开启M3U8标准加密改写(推荐)
未开启M3U8标准加密改写
加密视频
上传视频并接收回调。
为确保支持HLS标准加密的视频不被自动转码,在上传至视频点播时需要使用系统内置的不转码模板组进行上传,以防止上传时自动触发转码。
通过视频点播控制台上传,请参见通过视频点播控制台上传文件;通过服务端接口上传,请参见媒体上传。
配置视频点播的事件通知,当接收到视频上传完成的回调消息时,则表明视频已经上传到视频点播中。事件通知的配置方法,请参见事件通知。
搭建加密服务。
创建Service Key。
Service Key是密钥管理服务中的主加密Key,必须用于生成标准加密密钥。未创建将导致调用GenerateKMSDataKey - 创建KMS数据密钥接口生成密钥时将会报错。
单击页面左上方的服务地域标识,切换到需要创建Service Key的服务地域下。
说明创建的Service Key与视频存储的源站地域必须一致,例如:视频存储在华东2(上海),则Service Key必须在华东2(上海)创建。
登录视频点播控制台,选择配置管理 > 媒体处理配置 > 标准加密。
在标准加密页面,单击创建Service Key。
创建成功后,会提示您密钥(Service Key)创建成功,且在密钥信息区域可以查看您的Service Key。
说明若已提示密钥创建成功,仍未看到Service Key,可能是由于服务角色缺失导致,您可以通过重新授权恢复角色后再刷新页面查看Service Key。
调用接口生成数据密钥。
调用GenerateKMSDataKey - 创建KMS数据密钥接口生成数据密钥(DK)和信封数据密钥(EDK)时,无需传参。成功后,返回的CiphertextBlob即为AES_128格式的(EDK),需缓存此值用于标准加密转码。返回的Plaintext即为(DK)。
创建用于HLS标准加密的转码模板组。
HLS标准加密过程中需要用到两个转码模板组:系统内置的不转码模板组和需要自行创建的HLS标准加密模板组。HLS标准加密模板组创建方法如下:
发起HLS标准加密转码。
调用SubmitTranscodeJobs接口,发起HLS标准加密转码。
查看HLS标准加密结果。
转码完成后,您可以通过如下三种方式来判断标准加密是否成功。
方式一:登录视频点播控制台,选择媒资库 > 音/视频 > 管理 > 视频地址,在视频地址页面,如果视频有多种格式的输出(例如还存在格式为mp4的原始文件),只需要查看m3u8格式的视频流是否带有标准加密字样,如果存在,则表明标准加密成功。
方式二:将带有标准加密字样的M3U8文件的地址拷贝出来,使用命令
curl -v "M3U8文件地址"
,查看获取到的M3U8内容是否存在URI="<业务方在发起标准加密时传递的解密URI地址,即DecryptKeyUri参数值>"
关键信息,有则表明为标准加密且加密成功。方式三:调用GetTranscodeTask - 查询转码任务详情接口,传入步骤四中返回参数 JobId 的值。若返回参数TranscodeTemplateId为步骤三中创建的转码模板组ID且TranscodeJobStatus为转码成功,则表明为标准加密且加密成功。
HLS(M3U8)标准加密改写(推荐)
开启M3U8标准加密改写功能后,系统会在HLS协议的Media Playlist(M3U8文件)中#EXT-X-KEY标签后自动添加加密参数(如加密算法、密钥URI及鉴权参数)。客户端解析改写后的M3U8文件时,将使用带鉴权参数的密钥URI请求密钥,通过密钥和指定算法解密TS分片,从而实现HLS流媒体的加密访问保护
步骤一:开启标准加密参数透传
在视频点播控制台开启HLS标准加密参数透传。
开启HLS标准加密参数透传后,可改写HLS协议的M3U8文件,具体为修改#EXT-X-KEY标签中的URI,在其末尾追加客户端请求携带的参数,默认参数名为MtsHlsUriToken。
前提条件
已配置跨域访问,详情请参见配置跨域资源共享。
政务云暂不支持该功能。
操作步骤
登录点播控制台。
在左侧导航栏,单击配置管理。
单击分发加速配置 > 域名管理,进入域名管理页面。
在指定域名右侧的操作列,单击配置。
在指定域名的左侧导航栏,单击视频相关。
在加密播放区域,开启HLS标准加密参数透传开关。
开启后,HLS标准加密参数透传时,将通过改写Token鉴权信息参数帮您鉴权。改写的参数名称为
MtsHlsUriToken
,参数的值为test
。当CDN解密播放时,会将MtsHlsUriToken=test
追加到M3U8文件中#EXT-X-KEY
标签的URI末尾。
步骤二:携带MtsHlsUriToken参数请求
客户端携带MtsHlsUriToken参数向CDN节点发起对M3U8文件的访问请求。
其中,MtsHlsUriToken需要您自行搭建令牌服务,颁发用户令牌(即生成MtsHlsUriToken)。
下述代码所生成的Token即是MtsHlsUriToken。下述Java示例代码中,您需要按实际情况变更的参数如下:
步骤三:解密播放文件
CDN节点收到客户端请求后,鉴权通过则解密播放文件。
若上述步骤二中生成的MtsHlsUriToken
参数值为test
,则当CDN解密播放时,会将MtsHlsUriToken=test
追加到M3U8文件中#EXT-X-KEY
标签的URI末尾。
具体的鉴权校验逻辑您需要自行实现,可以参考播放视频中开启M3U8标准加密改写方式的解密服务的示例代码。
播放视频
开启M3U8标准加密改写(推荐)
搭建解密服务。
搭建一个本地HTTP服务,用于解密视频。
调用DecryptKMSDataKey - 解密KMS数据密钥密文接口进行解密,该接口返回的数据密钥(DK)即
PlainText
是GenerateKMSDataKey - 创建KMS数据密钥接口返回的PlainText
经过base64_decode之后的数据。如果您需要对解密地址进行安全验证,可以通过开启M3U8标准加密改写(默认改写的参数名为
MtsHlsUriToken
)实现对HLS数据访问过程的再次加密保护。根据您是否开启M3U8标准加密改写,搭建解密服务的代码实现不同,具体如下:获取视频播放地址和凭证。
调用GetVideoPlayAuth - 获取音视频播放凭证接口获取播放凭证或调用GetPlayInfo - 获取音视频播放地址接口获取播放地址。
播放加密视频。
HLS标准加密支持所有的HLS播放器,您可以选择使用自研的播放器或阿里云播放器进行播放加密视频。
如果使用阿里云播放器,请按照阿里云播放器的要求获取令牌和鉴权信息后播放,详情请参见如何播放加密视频。如果使用非阿里云播放器,请自行实现播放逻辑。
使用阿里云播放器测试播放的内部流程解析如下:
开启M3U8标准加密改写(推荐)
未开启M3U8标准加密改写
搭建解密服务。
搭建一个本地HTTP服务,用于解密视频。
调用DecryptKMSDataKey - 解密KMS数据密钥密文接口进行解密,该接口返回的数据密钥(DK)即
PlainText
是GenerateKMSDataKey - 创建KMS数据密钥接口返回的PlainText
经过base64_decode之后的数据。具体示例如下:
获取视频播放地址和凭证。
调用GetVideoPlayAuth - 获取音视频播放凭证接口获取播放凭证或调用GetPlayInfo - 获取音视频播放地址接口获取播放地址。
播放加密视频。
HLS标准加密支持所有的HLS播放器,您可以选择使用自研的播放器或阿里云播放器进行播放加密视频。
如果使用阿里云播放器,请按照阿里云播放器的要求获取令牌和鉴权信息后播放,详情请参见如何播放加密视频。如果使用非阿里云播放器,请自行实现播放逻辑。
使用阿里云播放器测试播放的内部流程解析如下:
未开启M3U8标准加密改写