概述
????????原始的RTSP通信默認使用的是明文傳輸,這也就意味著,在網絡上的任何節點都能輕易地查看或修改傳輸的內容。這在涉及隱私或版權保護的場景下,是完全不可接受的。因此,加密顯得尤為重要。加密的目的主要有三點:一是進行身份驗證,確認通信雙方的身份;二是確保數據在傳輸過程中,不被未經授權的第三方讀取;三是保證數據的完整性,確保數據在傳輸過程中不被篡改。
????????為了加密傳輸信令和碼流,確保媒體數據的安全性,通常采取以下兩種策略:RTSP Over TLS、SRTP。
RTSP Over TLS
????????RTSP Over TLS是指在RTSP協議通信過程中,使用TLS(Transport Layer Security)協議或SSL(Secure Sockets Layer)協議對RTSP信令消息進行加密傳輸,以保護通信內容的安全性和隱私性。這類似于HTTPS對于HTTP的加密方式,提高了協議的安全等級。
????????實現RTSP Over TLS的大致步驟如下。
????????1、證書準備。我們需要為RTSP服務器配置一個有效的SSL/TLS證書,證書可以是從受信任的CA(Certificate Authority,證書頒發機構)購買的證書,也可以是自簽名證書(主要用于測試環境,生產環境不推薦)。
????????2、服務器配置。大多數現代的RTSP服務器軟件(比如:VLC、GStreamer等)都支持TLS加密,我們需要在服務器配置文件中指定證書和私鑰的路徑,并啟用TLS端口。TLS端口默認是443,也可以是其他端口,比如:554等。
????????3、客戶端連接。客戶端需要使用支持TLS的RTSP URL來發起連接請求,格式通常為:
????????????????rtsps://address:port/path
????????上面的“rtsps”表示安全連接,即TLS加密。
????????4、握手與驗證。連接建立過程中,客戶端與服務器會執行TLS握手,驗證服務器證書的有效性。如果證書被客戶端信任,則建立加密連接。否則,連接可能會失敗。
????????注意:默認的RTSP端口是554,但未指定是否加密。使用TLS時,通常建議使用443端口,這是TLS的標準端口。當然,也可以選擇其他端口,并明確告知客戶端。TLS加密會增加額外的CPU負載,尤其是在視頻流傳輸這樣對實時性要求較高的場景中,需要確保服務器有足夠的處理能力。另外,RTSP Over TLS只會對RTSP的信令進行加密,并不會對媒體流進行加密。
SRTP
????????對于媒體流的加密,最常用的是SRTP(Secure RTP)。SRTP是一種專為RTP設計的安全增強層協議,是對RTP協議的擴展,提供了對媒體流數據包的加密、消息認證、重放保護和密鑰管理等功能。它支持多種加密算法,比如:AES-CM、AES-GCM等。同樣的,RTCP協議也可以擴展為更安全的SRTCP(Secure RTCP)。
????????SRTP的報文格式如下,其Payload部分是加密的。可以看到,除了末尾的SRTP MKI和authentication tag外,其他與RTP報文完全相同。
????????SRTP MKI :可選,用于標識主密鑰。MKI不受完整性保護,因為這不提供任何額外保護。
????????Authentication Tag:推薦使用,認證標簽,用于攜帶消息認證數據。SRTP數據包的認證部分由RTP頭和加密的Payload部分組成。身份驗證標簽可以提高對RTP頭和有效載荷的身份驗證,并通過對序列號進行身份驗證來間接提供重放保護。
0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<+|V=2|P|X| CC |M| PT | sequence number | |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ || timestamp | |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ || synchronization source (SSRC) identifier | |+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ || contributing source (CSRC) identifiers | || .... | |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ || RTP extension (OPTIONAL) | |+>+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ || | Payload ... | || | +-------------------------------+ || | | RTP padding | RTP pad count | |+>+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<+| ~ SRTP MKI (OPTIONAL) ~ || +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ || : Authentication Tag (RECOMMENDED) : || +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
????????實現SRTP的大致步驟如下。
????????1、會話建立。首先,客戶端發送一個OPTIONS請求來查詢服務器支持的命令集。雖然這一步不是必須的,但在某些情況下有助于客戶端了解服務器的能力。然后,客戶端發送DESCRIBE請求獲取會話描述信息,SDP中可能包含有關媒體類型、編碼、端口等信息。對于SRTP,SDP中還可能包含安全屬性行(比如:a=crypto),以表明支持安全傳輸。
????????2、協商加密。在RTSP的SETUP請求和響應中,客戶端和服務器協商使用SRTP。比如:客戶端可以請求使用SRTP傳輸。
SETUP rtsp://server.example.com/stream/trackID=1 RTSP/1.0
Transport: RTP/SAVPF;unicast;client_port=49154-49155
????????密鑰的協商,可以通過外部機制(比如:DTLS-SRTP、SDES 、ZRTP等)來進行。如果使用DTLS-SRTP,客戶端和服務器會在RTSP SETUP之后,基于RTSP提供的傳輸信息,建立DTLS連接,通過DTLS通道安全地交換SRTP密鑰和參數。
????????3、初始化SRTP上下文。一旦密鑰通過DTLS-SRTP成功交換,客戶端和服務器都會使用這些密鑰初始化各自的SRTP和SRTCP上下文。
????????4、開始播放。客戶端發送PLAY請求,開始媒體流的傳輸。此時,所有RTP和RTCP數據包都通過之前建立的安全通道傳輸,并應用SRTP/SRTCP進行加密和認證。
????????5、媒體流加密傳輸。在媒體流傳輸期間,RTP數據包被加密并通過安全的通道傳輸,而RTCP包用于質量控制和反饋,同樣受到SRTCP的保護。
????????6、會話結束。當會話結束時,除了RTSP的TEARDOWN信令外,還需要確保所有安全上下文被正確清理,包括釋放DTLS連接和廢棄SRTP密鑰,以保障安全性。
總結
????????為了全面保護RTSP流媒體通信的全流程,通常會結合使用RTSP Over TLS來加密控制信令,以及SRTP來加密媒體流,形成一個從控制到數據傳輸的全方位安全體系。這種組合確保了從會話建立到媒體播放的每一個環節都受到保護,滿足了高安全標準的實時流媒體傳輸需求。