當用戶端請求 M3U8 檔案時,系統會將其攜帶的鑒權參數自動追加到 #EXT-X-KEY 標籤中的密鑰 URI 後。無需來源站點改造,即可實現密鑰訪問的安全控制,有效防止視頻內容被盜播。
適用情境
在標準的 HLS 加密流程中,#EXT-X-KEY 標籤指明了擷取解密密鑰的 URI。如果此 URI 是一個固定的、無保護的公開地址,任何擷取到 M3U8 檔案的人都可以下載密鑰,從而解密視頻內容,導致視頻加密失效。
為解決此問題,此功能為每次密鑰請求附加一個動態、可驗證的鑒權憑證,適用於需要對 HLS 加密視頻的密鑰進行存取控制的情境,例如:
付費視頻/線上教育:為防止學員將 M3U8 地址分享給非付費使用者,通過為每個登入使用者產生唯一的鑒權參數,確保只有合法使用者才能在有效期間內擷取到解密密鑰。
直播著作權保護:在大型體育賽事或活動直播中,通過動態產生的鑒權參數與 CDN 的 URL 鑒權功能結合,實現對直播流的精細化存取控制,有效防止盜鏈。
技術原理
用戶端請求商務服務器,商務服務器根據商務邏輯(如使用者登入)產生一個帶有時效性和簽名的鑒權參數(例如
token=xxxx),並將其返回給用戶端。用戶端使用這個鑒權參數,將其拼接在請求M3U8檔案的URL末尾,然後向 CDN 節點發起 M3U8 檔案請求。
CDN 節點在向用戶端返回 M3U8 檔案前,解析 M3U8 檔案內容,找到
#EXT-X-KEY標籤,並將用戶端請求 URL 中的鑒權參數追加到其URI屬性的末尾。用戶端擷取 CDN 返回的、已被改寫的 M3U8 檔案,並根據其中新的密鑰 URI(已包含鑒權參數)向密鑰伺服器發起請求。
密鑰伺服器收到密鑰請求,提取並校正 URL 中的鑒權參數。校正通過後,返回解密密鑰;校正失敗,則拒絕請求。
用戶端擷取密鑰後,解密 TS 視頻流並播放。
此功能不負責對視頻內容進行加密。使用此功能前,必須在來源站點確保視頻切片(TS 檔案)已完成 HLS 標準加密(如 AES-128),且原始 M3U8 檔案中已包含正確的 #EXT-X-KEY 標籤。視頻加密請參考如何產生M3U8檔案並加密。
引入商務服務器和密鑰伺服器是為了更好的介紹M3U8標準加密改寫的作用,此功能不負責商務服務器和密鑰伺服器的實現。您需要自己實現商務服務器和密鑰伺服器的功能,以便完成整個HLS密鑰鑒權的流程。
#EXT-X-KEY標籤的作用是聲明是否加密。更多關於M3U8檔案標籤的介紹請參見M3U8標籤簡介。
操作步驟
登入CDN控制台。
在左側導覽列,單擊域名管理。
在域名管理頁面,找到目標網域名稱,單擊操作列的管理。
在指定網域名稱的左側導覽列,單擊视频相关。
在M3U8標準加密改寫地區,開啟M3U8標準加密改寫開關。
說明開啟M3U8標準加密改寫功能後,預設的參數名為
MtsHlsUriToken。可選:如果您需要配合您的用戶端修改參數名,請執行以下操作步驟。
單擊自訂參數名對應的修改。
在自訂參數名對話方塊,設定參數名。
說明參數名大小寫敏感,請確保設定的參數名和用戶端請求攜帶的參數名完全一致。例如用戶端請求攜帶
MtsHlsUriToken參數,如果在CDN控制台設定自訂參數名為mtshlsuritoken將不生效。單擊確定,完成配置。
示範樣本
在瀏覽器中訪問經過CDN加速的M3U8檔案,並在請求最後加上MtsHlsUriToken=tokenxxxxx。例如:http://<CDN 加速網域名稱>/video.m3u8?MtsHlsUriToken=tokenxxxxx
通過Chrome瀏覽器開發人員工具,在Network(網路)面板,可以看到請求M3U8檔案是帶上了自訂參數,但是請求密鑰地址時沒有攜帶該參數。

在CDN控制台開啟M3U8標準加密改寫,如果需要,可以設定自訂參數名,如下圖所示(本次示範中使用預設參數
MtsHlsUriToken)。
重複步驟1,在瀏覽器中訪問經過CDN加速的M3U8檔案,並在請求最後加上MtsHlsUriToken=tokenxxxxx。
通過瀏覽器開發人員工具,在Network(網路)面板,可以看到在請求密鑰地址時,帶上了自訂的參數。

常見問題
什麼是HLS協議?
HLS(HTTP Live Streaming的縮寫)是一個由蘋果公司提出的基於HTTP的流媒體網路傳輸協議。HLS協議基於HTTP協議,用戶端按照順序使用HTTP協議下載儲存在伺服器上的檔案。HLS協議規定,視頻的封裝格式是TS(Transport Stream),除了TS視頻檔案本身,還定義了用來控制播放的M3U8檔案(文字檔)。HLS協議的工作原理是把整個視頻流分割成一個個小的TS格式視頻檔案來傳輸,在開始一個流媒體會話時,用戶端會先下載一個包含TS檔案URL地址的M3U8檔案(相當於一個播放清單),給用戶端用於下載TS檔案。
HLS協議的M3U8檔案裡都有什嗎?
M3U8檔案的基本欄位:
#EXTM3U:M3U8檔案頭,必須放在第一行。EXT-X-MEDIA-SEQUENCE:第一個TS分區的序號,一般情況下是0,但是在直播情境下,這個序號標識直播段的起始位置;#EXT-X-MEDIA-SEQUENCE:0。#EXT-X-TARGETDURATION:每個分區TS的最大的時間長度;#EXT-X-TARGETDURATION:10,表示每個分區的最大時間長度是10秒。#EXT-X-ALLOW-CACHE:是否允許cache,#EXT-X-ALLOW-CACHE:YES、#EXT-X-ALLOW-CACHE:NO,預設情況下是YES。#EXT-X-ENDLIST:M3U8檔案結束符。#EXTINF:extra info,分區TS的資訊,如時間長度,頻寬等;一般情況下是#EXTINF:<duration>,[<title>]後面可以跟其他的資訊,逗號之前是當前分區的TS時間長度。分區時間長度要小於#EXT-X-TARGETDURATION定義的值。#EXT-X-VERSION:M3U8版本號碼。#EXT-X-DISCONTINUITY:該標籤表明其前一個切片與下一個切片之間存在中斷。#EXT-X-PLAYLIST-TYPE:表明流媒體類型。#EXT-X-KEY:是否加密解析。例如:#EXT-X-KEY:METHOD=AES-128,URI="https://example.com/video.key?token=xxx"密碼編譯演算法是AES-128,密鑰通過請求https://example.com/video.key?token=xxx來擷取,密鑰請求回來以後儲存在本地,並用於解密後續下載的TS視頻檔案。
如何產生M3U8檔案並加密?
產生加密金鑰。
這個密鑰通常是一個16位元組的隨機字串(對於AES-128加密)。可以使用 OpenSSL 工具用以下命令來產生包含16個隨機位元組的密鑰。
openssl rand 16 > encryption_key.key準備加密使用的
key_info.txt檔案,加密工具會根據該檔案對HLS協議的視頻檔案進行加密。https://example.com/encryption_key.key /path/to/local/encryption_key.key第一行是步驟1產生的加密金鑰的URL。推薦將該檔案放置在CDN加速的OSS來源站點中,然後使用CDN加速網域名稱來訪問該檔案。
第二行是本地密鑰檔案的絕對路徑。
使用
FFmpeg工具產生並加密HLS協議的視頻檔案。ffmpeg -i input_video.mp4 -c:v copy -c:a copy -hls_time 10 -hls_key_info_file key_info.txt -hls_list_size 0 output_playlist.m3u8-i input_video.mp4:指定需要轉換的視頻檔案,例如,MP4格式視頻。-c:v copy: 視頻流不重新編碼,直接複製。-c:a copy: 音頻流不重新編碼,直接複製。-hls_time 10: 每個TS檔案的時間長度為 10 秒,可以根據原始視頻時間長度修改該設定。-hls_key_info_file key_info.txt: 指定包含加密金鑰資訊的檔案。-hls_list_size 0:設定M3U8檔案中保留的TS檔案索引數量,0表示保留所有.ts檔案索引。output_playlist.m3u8: 輸出的 HLS 播放清單檔案名稱(即M3U8檔案名稱)。
將加密後的
TS檔案和M3U8檔案儲存到伺服器中(推薦使用CDN加速的OSS來源站點)。然後在瀏覽器中使用CDN加速網域名稱訪問M3U8檔案,即可實現加密播放HLS協議的視頻。