概述
視頻加密是對視頻內容保護的一種手段。對視頻中的內容進行加密,可有效防止視頻洩露和盜鏈問題。目前,視頻加密廣泛用於在線教育及財經等領域。阿里雲視頻點播目前支持的加密方式有 "阿里雲私有加密"和"HLS 標準加密"。
其中私有加密是點播服務完全託管的,用戶無需自己搭建解密接口,實際播放的時候必須使用阿里雲播放器通過VideoId+播放憑證的方式去播放。HLS標準加密依賴於KMS密鑰管理服務,需要用戶自己搭建解密接口服務,支持直接使用URL方式播放,並且可以使用第三方播放器來完成播放。
目前視頻點播官網幫助中心有提供HLS標準加密的開發文檔,具體可以點擊這裡閱讀。本文在此開發文檔的基礎上,補充說明一些開發者經常遇到的問題,以便更快速的定位解決問題。
SubmitTranscodeJobs提交轉碼作業錯誤
1. KeyNotFound
出現這種錯誤提示一般都是使用的加密Service Key 和視頻不在同一個區域,例如:華東2的視頻,必須使用華東2的KMS生成祕鑰。
2. NoSuchResource
出現這種錯誤通常代表用戶的某種的資源缺失,可以結合Error Message進行排查。
(1)can not find cross service token
表示用戶沒有通過RAM授權點播操作用戶的KMS導致,需要用戶使用RAM服務給視頻點播授權訪問業務方祕鑰管理服務(KMS)的權限,請參考HLS標準加密開發文檔的第二步,點擊 RAM授權 給視頻點播授權,如下圖所示:
特別注意,授權的AliyunVODDefaultRole角色是一個系統角色,該角色默認就授權了AliyunVODRolePolicy這個系統策略,視頻點播服務會默認使用此角色來訪問賬號下其他雲產品中的資源,請勿去修改或者刪除此角色下的策略。如果誤操作修改了錯誤的策略,可以考慮刪除次角色以後,點擊上面描述的鏈接重新去授權下這個系統角色。
(2)can not find customer encrypt master key
表示在用戶對應區域的KMS中沒有拿到響應的加密Service key,請確保已經開通Service key,並且到KMS控制檯對應區域拿到對應的Service key信息(描述信息是acs/vod)。
(3)can not find customer encrypt info
表示用戶傳遞的密文祕鑰(也就是Ciphertext值)不是使用KMS生成,或者祕鑰生成和視頻存儲不在同一個區域,需要用戶在視頻相應區域生成加密祕鑰。
(4)can not find customer plaintext
表示用戶生成的祕鑰解密不到明文祕鑰,需要用戶使用GenerateDataKey生成加密祕鑰。
(5)The specified resource Template does not exist
表示視頻對應區域的轉碼模板數據不存在,需要檢查SubmitTranscodeJobs接口傳入的TemplateGroupId參數是否正確。
轉碼後的視頻文件未加密
生成的文件未加密,一般都是由於轉碼模板在設置的時候沒有選擇HLS加密選項(標準加密、私有加密必須要勾選),請在點播控制檯設置轉碼模板處,高級參數裡開啟"視頻加密"選項,並選擇加密方式為"私有加密",參考下圖
注意:無論是"阿里雲私有加密"還是"HLS標準加密",都必須開啟視頻加密,並選擇加密方式為私有加密。
加密轉碼失敗
視頻標準加密失敗,一般都是由於用戶在調用GenerateDataKey生成的祕鑰是非AES_128位的,或者祕鑰使用自定義字符串生成。這裡在調用KMS的GenerateDataKey接口時,傳遞的KeySpec參數必須是AES_128。
解密失敗無法播放
通常HLS標準加密成功,說明祕鑰應該是沒問題的,那麼解密失敗通常是由於解密接口服務本身就異常或者解密接口返回的內容不對導致。
1. DecryptKeyUri傳遞的地址無法訪問
SubmitTranscodeJobs接口文檔裡EncryptConfig參數裡的DecryptKeyUri的示例是
http://decrypt.demo.com?CipherText=ZjJmZGViNzUtZWY1Mi00Y2RlLTk3MTMt
這裡要特別注意,這個decrypt.demo.com只是一個示例的值,實際是必須替換成用戶搭建的解密接口服務器的域名,並且需要公網可達,總之必須保證播放器能成功請求到這個地址,並且能正常請求到解密接口邏輯裡。
2. 瀏覽器Block
瀏覽器要求在HTTPS的頁面里加載的資源必須也是HTTPS的,如果傳遞的DecryptKeyUri是HTTP的,但是播放頁面卻是HTTPS的,會導致Web端的播放器因為瀏覽器安全原因導致無法正常請求解密接口服務器地址,導致無法正常解密,這種情況需要設置DecryptKeyUri為HTTPS的地址(需要對解密服務器域名配置HTTPS證書)。如下圖,可以在瀏覽器開發者工具的Console裡看到Mixed Content的錯誤,就是這個原因造成的
另外,Console下如果有No 'Access-Control-Allow-Origin'的錯誤,則說明是跨域問題導致的,需要對解密服務器域名配置跨域,返回Access-Control-Allow-Origin這個Http頭。
3. 解密接口返回的明文密鑰不對
很多用戶可能會把Decrypt接口返回的json串直接返回給播放器,或者把接口返回的Plaintext直接返回給播放器,這是不對的。解密服務只需要把KMS的Decrypt接口返回的Plaintext 做base64 decode以後返回給播放器就行了,最終返回給播放器的是二進制數據。如下圖所示,在Network下看解密接口的Response信息,應該是一個亂碼的內容,因為二進制數據瀏覽器無法正常解碼
下圖展示了一個正常的過程,我們可以從m3u8文件裡拿到解密接口地址,然後請求解密接口地址拿到這個接口返回的密鑰,正常情況這個返回的密鑰是Plaintext做base64 decode以後的值,是二進制數據,可以用二進制解析工具查看,並且該文件是16字節的。
MtsHlsUriToken參數重寫失效
如果需要對播放用戶進行自定義鑑權,則需要通過MtsHlsUriToken參數來傳遞令牌,解密接口服務對令牌進行鑑權。可以到點播控制檯域名管理界面開啟,參考HLS標準加密改寫。
如果域名開啟了URL鑑權,則MtsHlsUriToken參數重寫功能不生效,目前MtsHlsUriToken參數重寫和鑑權功能是互斥的。