RTSP系列:
RTSP系列四:RTSP Server/Client实战项目-CSDN博客
目录
一、RTSP鉴权介绍
RTSP鉴权包括两种:基本认证(basic)和摘要认证(digest)。基本认证是http 1.0提出的认证方案,其消息传输不经过加密转换因此存在严重的安全隐患。摘要认证是http 1.1提出的基本认证的替代方案,其消息经过MD5哈希转换因此具有更高的安全性。
RTSP使用的基本都是摘要认证,本文将对RTSP中的摘要认证进行详细介绍。不带鉴权的RTSP Url为:rtsp://ip:port/suffix,带鉴权的RTSP Url为:rtsp://用户名:密码@ip:port/suffix。客户端需要在请求中添加鉴权字段,否则服务器会返回401,表示客户端没有授权并拒绝客户端的请求,但不是所有的请求都需要鉴权,比如OPTIONS就不需要鉴权。如下所示,服务端返回401拒绝客户端请求:
---------------C->S--------------
OPTIONS rtsp://192.168.10.18:8554/live RTSP/1.0
CSeq: 2
User-Agent: LibVLC/3.0.21 (LIVE555 Streaming Media v2016.11.28)
---------------S->C--------------
RTSP/1.0 200 OK
CSeq: 2
Public: OPTIONS, DESCRIBE, SETUP, PLAY
---------------C->S--------------
DESCRIBE rtsp://192.168.10.18:8554/live RTSP/1.0
CSeq: 3
User-Agent: LibVLC/3.0.21 (LIVE555 Streaming Media v2016.11.28)
Accept: application/sdp
---------------S->C--------------
RTSP/1.0 401 Unauthorized
CSeq: 3
WWW-Authenticate: Digest realm="simple-rtsp-server", nonce="fea261aa3d9310f32b2a9d8e1454fa3c"
服务端在响应报文中添加了WWW-Authenticate字段,这个字段是服务器内部生成的,用于后续的鉴权,Digest表示使用摘要认证,realm和nonce用于鉴权计算。
二、RTSP摘要认证计算
摘要认证流程如下:
1、客户端收到401之后,从WWW-Authenticate中解析出realm和nonce的值。
2、客户端以用户名,密码,nonce,RTSP方法,请求的URI等信息为基础计算授权response的值,计算公式如下:
1)当password为MD5编码
response = md5( password:nonce:md5(public_method:url) );
2)当password为ANSI字符串
response= md5( md5(username:realm:password):nonce:md5(public_method:url) );
3、客户端重新发起请求并添加授权字段:
Authorization: Digest username="admin", realm="simple-rtsp-server", nonce="fea261aa3d9310f32b2a9d8e1454fa3c", uri="rtsp://192.168.10.18:8554/live", response="6b6f6d63581262aa05ee4ddada5c3f6b"
4、服务器对客户端反馈的response进行校验,如果验证通过则对报文进行响应,否则返回401,客户端授权失败。
5、客户端验证通过继续发起其他请求,所有请求都需要添加授权字段,服务器对每个请求都进行鉴权。
三、RTSP摘要完整交互流程
下面是带鉴权的完整交互流程:
---------------C->S--------------
OPTIONS rtsp://192.168.10.18:8554/live RTSP/1.0
CSeq: 2
User-Agent: LibVLC/3.0.21 (LIVE555 Streaming Media v2016.11.28)
---------------S->C--------------
RTSP/1.0 200 OK
CSeq: 2
Public: OPTIONS, DESCRIBE, SETUP, PLAY
---------------C->S--------------
DESCRIBE rtsp://192.168.10.18:8554/live RTSP/1.0
CSeq: 3
User-Agent: LibVLC/3.0.21 (LIVE555 Streaming Media v2016.11.28)
Accept: application/sdp
---------------S->C--------------
RTSP/1.0 401 Unauthorized
CSeq: 3
WWW-Authenticate: Digest realm="simple-rtsp-server", nonce="fea261aa3d9310f32b2a9d8e1454fa3c"
---------------C->S--------------
DESCRIBE rtsp://192.168.10.18:8554/live RTSP/1.0
CSeq: 4
Authorization: Digest username="admin", realm="simple-rtsp-server", nonce="fea261aa3d9310f32b2a9d8e1454fa3c", uri="rtsp://192.168.10.18:8554/live", response="6b6f6d63581262aa05ee4ddada5c3f6b"
User-Agent: LibVLC/3.0.21 (LIVE555 Streaming Media v2016.11.28)
Accept: application/sdp
---------------S->C--------------
RTSP/1.0 200 OK
CSeq: 4
Content-Base: rtsp://192.168.10.18:8554/live
Content-type: application/sdp
Content-length: 375
v=0
o=- 91722585321 1 IN IP4 192.168.10.18
c=IN IP4 192.168.10.18
t=0 0
a=control:*
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1
a=control:track0
m=audio 0 RTP/AVP 97
a=rtpmap:97 MPEG4-GENERIC/44100/2
a=fmtp:97 streamtype=5;profile-level-id=1;mode=AAC-hbr;config=1390;sizelength=13;indexlength=3;indexdeltalength=3
a=control:track1
---------------C->S--------------
SETUP rtsp://192.168.10.18:8554/live/track0 RTSP/1.0
CSeq: 5
Authorization: Digest username="admin", realm="simple-rtsp-server", nonce="fea261aa3d9310f32b2a9d8e1454fa3c", uri="rtsp://192.168.10.18:8554/live", response="c1b74c41e6611ac4875fa0a5c2f5cf7e"
User-Agent: LibVLC/3.0.21 (LIVE555 Streaming Media v2016.11.28)
Transport: RTP/AVP;unicast;client_port=61878-61879
---------------S->C--------------
RTSP/1.0 200 OK
CSeq: 5
Transport: RTP/AVP;unicast;client_port=61878-61879;server_port=1025-1026
Session: 21779483
---------------C->S--------------
SETUP rtsp://192.168.10.18:8554/live/track1 RTSP/1.0
CSeq: 6
Authorization: Digest username="admin", realm="simple-rtsp-server", nonce="fea261aa3d9310f32b2a9d8e1454fa3c", uri="rtsp://192.168.10.18:8554/live", response="c1b74c41e6611ac4875fa0a5c2f5cf7e"
User-Agent: LibVLC/3.0.21 (LIVE555 Streaming Media v2016.11.28)
Transport: RTP/AVP;unicast;client_port=61880-61881
Session: 21779483
---------------S->C--------------
RTSP/1.0 200 OK
CSeq: 6
Transport: RTP/AVP;unicast;client_port=61880-61881;server_port=1027-1028
Session: 21779483
---------------C->S--------------
PLAY rtsp://192.168.10.18:8554/live RTSP/1.0
CSeq: 7
Authorization: Digest username="admin", realm="simple-rtsp-server", nonce="fea261aa3d9310f32b2a9d8e1454fa3c", uri="rtsp://192.168.10.18:8554/live", response="5a2e7558c7c089ceb1000f14f7f3b0da"
User-Agent: LibVLC/3.0.21 (LIVE555 Streaming Media v2016.11.28)
Session: 21779483
Range: npt=0.000-
---------------S->C--------------
RTSP/1.0 200 OK
CSeq: 7
Range: npt=0.000-
Session: 21779483; timeout=60
四、基本认证
基本认证由于缺乏安全性,实际根本不会使用,不过这里还是进行一下简单的介绍。
基本认证服务器返回的401消息如下:
RTSP/1.0 401 Unauthorized
CSeq: 6
WWW-Authenticate: Basic realm=“000102030405”
Date: Tue, Mar 19 2019 07:07:12 GMT
客户端对username:password进行base64编码,然后添加Authorization字段重新发起请求:
DESCRIBE rtsp://10.175.30.35 RTSP/1.0
CSeq: 7
Authorization: Basic YWRtaW46YWJjZDEyMzQ=
Accept: application/sdp
“YWRtaW46YWJjZDEyMzQ=” 就是username:password 的base64值。服务端对其解码得到用户名和密码进行鉴权。