流媒体传输 - RTSP 协议认证过程

Rtsp 认证 主要分为两种:

基本认证 (Basic authentication)和 摘要认证 (Digest authentication)

基本认证是 HTTP 1.0 提出的认证方案,其消息传输不经过加密转换因此存在严重的安全隐患。

摘要认证是 HTTP 1.1 提出的基本认证的替代方案,其消息经过 MD5 哈希转换因此具有更高的安全性。

基本认证

  1. 客户端发送 DESCRIBE 请求到服务端

    DESCRIBE rtsp://192.168.199.242:554/ch1/main/av_stream RTSP/1.0
    CSeq: 3
    User-Agent: LibVLC/3.0.8 (LIVE555 Streaming Media v2016.11.28)
    Accept: application/sdp

  2. RTSP 服务端认为没有通过认证,发出 WWW-Authenticate 认证响应

     WWW-Authenticate 中应携带有 Basic 字样、realm 字段

    RTSP/1.0 401 Unauthorized
    CSeq: 3
    WWW-Authenticate: Basic realm="IP Camera(D1846)"
    Date:  Thu, Oct 15 2020 23:30:55 GMT

  3. 客户端携带 Authorization 串再次发出 DESCRIBE 请求

     Authorization 串计算方法:
     Authorization = base64(username:password)
    
     * 用户名:admin * 密码:Abc12345
     Authorization = base64(admin:Abc12345)
                   = YWRtaW46QWJjMTIzNDU=

    DESCRIBE rtsp://192.168.199.242:554/ch1/main/av_stream RTSP/1.0
    CSeq: 4
    Authorization: Basic YWRtaW46QWJjMTIzNDU=
    User-Agent: LibVLC/3.0.8 (LIVE555 Streaming Media v2016.11.28)
    Accept: application/sdp

  4. 服务器对客户端反馈的 Authorization 进行校验,通过则返回 200 OK

    RTSP/1.0 200 OK
    CSeq: 4
    Content-Type: application/sdp
    Content-Base: rtsp://192.168.199.242:554/ch1/main/av_stream/
    Content-Length: 594

摘要认证

  1. 客户端发送 DESCRIBE 请求到服务端

    DESCRIBE rtsp://192.168.199.242:554/ch1/main/av_stream RTSP/1.0
    CSeq: 3
    User-Agent: LibVLC/3.0.8 (LIVE555 Streaming Media v2016.11.28)
    Accept: application/sdp

  2. RTSP 服务端认为没有通过认证,发出 WWW-Authenticate 认证响应

     WWW-Authenticate 中应携带有 Digest 字样、realm 字段、nonce 字段

    RTSP/1.0 401 Unauthorized
    CSeq: 3
    WWW-Authenticate: Digest realm="IP Camera(D1846)", nonce="61f92652b25e740d73887108b419e8b6", stale="FALSE"
    Date:  Thu, Oct 15 2020 23:30:55 GMT

  3. 客户端以 用户名、密码、nonce、RTSP 方法、请求的 URI 等信息为基础产生 response 信息进行反馈

     response 计算方法:
     RTSP 客户端应该使用 username + password 并计算 response 如下:
     如果 password 为 MD5 编码, 则
         response = md5(password:nonce:md5(public_method:url));
     如果 password 为 ANSI 字符串, 则
         response = md5(md5(username:realm:password):nonce:md5(public_method:url));
    
     * 用户名:admin * 密码:Abc12345
     response = md5(md5(admin:IP Camera(D1846):Abc12345):61f92652b25e740d73887108b419e8b6:md5(DESCRIBE:rtsp://192.168.199.242:554/ch1/main/av_stream));
              = md5(e03ca5323610c45d55574699008d1c34:61f92652b25e740d73887108b419e8b6:034c626594db40bb96121247d4492461)
              = 58ad47d8436ca5db7356e6a084abcbf9

    DESCRIBE rtsp://192.168.199.242:554/ch1/main/av_stream RTSP/1.0
    CSeq: 4
    Authorization: Digest username="admin", realm="IP Camera(D1846)", nonce="61f92652b25e740d73887108b419e8b6", uri="rtsp://192.168.199.242:554/ch1/main/av_stream", response="58ad47d8436ca5db7356e6a084abcbf9"
    User-Agent: LibVLC/3.0.8 (LIVE555 Streaming Media v2016.11.28)
    Accept: application/sdp

  4. 服务器对客户端反馈的 response 进行校验,通过则返回 200 OK

    RTSP/1.0 200 OK
    CSeq: 4
    Content-Type: application/sdp
    Content-Base: rtsp://192.168.199.242:554/ch1/main/av_stream/
    Content-Length: 594