RTMP流媒体服务端应用开发系列 – Nginx-Rtmp鉴权设置 | 贝壳博客

标签: | 发表时间:2019-05-07 12:04 | 作者:
出处:http://bashell.nodemedia.cn

鉴权验证在自建直播流媒体服务端应用中是非常重要的。用以防止非法推流,控制收费播放盗链等场景。
目前各大直播云平台都支持url参数形式的鉴权验证法,例如rtmp://serverhost/app-name/stream-name?key=md5(secret+expires_timestemp)&time=expires_timestemp 这种既有私密key,又有时间戳过期判断的最简单形式,当然还能根据使用场景增加其他判断条件。
Nginx-Rtmp模块作为rtmp直播流媒体服务端,本身没有这种鉴权验证法,但能通过 Notify 转为本地的http请求,使用Nginx内置的 ngx_http_secure_link_module即能达到同样效果。

首先利用Nginx-Rtmp的on_play通知,将rtmp的播放事件通知到本地的http处理上来

1
2
3
4
5
6
7
8
9
10
rtmp{
    server{
        listen1935;
        applicationplay{
            liveon;
            notify_methodget;
            on_playhttp://127.0.0.1/on_play;
        }
    }
}

注意一定要将通知改为get形式

本地http处理/on_play

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
http{
    server{
        listen80;
        set$auth_key"nodemedia2016";
 
        location/on_play{
            secure_link$arg_key,$arg_time;
            secure_link_md5"$auth_key$arg_time";
            
            if($secure_link=""){
                return404;#验证失败
            }
 
            if($secure_link="0"){
                return410;#验证成功,但时间失效
            }
            
            return200;
        }
    }
}

rtmp url的生成者负责生成一条包含key和time参数的url,并计算好过期时间。
比如原始rtmp url 是: rtmp://stream.nodemedia.cn/live/demo,生成url的时间是2016/7/24 17:00:00 时间戳即是1469350800,我们希望1分钟后这个url失效,那么失效时间戳就是1469350860,我们和服务端约定好的auth_key是”nodemedia2016″,那么按照nginx的约定先对『nodemedia20161469350860』这个拼装的字符串md5,再base64,如果有再替换”+/”为 “-_”,如果有再删除”=”(比较繁琐)

Shell
1
2
echo-n'nodemedia20161469350860'|\
    opensslmd5-binary|opensslbase64|tr+/-_|tr-d=

得到 ldorjTG99nd0juc88bltiQ这样的字符串,这就是key参数的值了,拼装为

rtmp://stream.nodemedia.cn/live/demo?key=ldorjTG99nd0juc88bltiQ&time=1469350860

1分钟内请求是可以正常播放的,1分钟后再请求,会直接被nginx服务器断开socket。

本方法利用Nginx-Rtmp 的开始播放的通知事件转为内部http利用内置ngx_http_secure_link_module模块达到鉴权实现。原理很简单,不过略繁琐。

在这里,本人参照网宿CDN的模式对ngx_http_secure_link_module进行了修改,增加了secure_link_extime参数,在服务器内部控制过期时间,rtmp_url的生成者只需传入当前时间戳,来隐蔽过期时间。加密部分只需一次md5,不再转base64再替换字符串那么繁琐,时间戳也采用HEX形式隐蔽。

原创文章,转载请注明:转载自 贝壳博客

本文链接地址: RTMP流媒体服务端应用开发系列 – Nginx-Rtmp鉴权设置

相关 [rtmp 流媒体 服务] 推荐:

RTMP 流媒体服务器 GitHub - arut/nginx-rtmp-module: NGINX-based Media Streaming Server

- -
几个优秀的RTMP 流媒体服务器:. NGINX-based Media Streaming Server:基于Nginx插件. SRS(Simple RTMP Server) over state-threads:基于C++. livego:基于go语言. node-rtsp-rtmp-server:基于 Node.js.

RTMP流媒体服务端应用开发系列 – Nginx-Rtmp鉴权设置 | 贝壳博客

- -
鉴权验证在自建直播流媒体服务端应用中是非常重要的. 用以防止非法推流,控制收费播放盗链等场景. 目前各大直播云平台都支持url参数形式的鉴权验证法,例如rtmp://serverhost/app-name/stream-name?key=md5(secret+expires_timestemp)&time=expires_timestemp 这种既有私密key,又有时间戳过期判断的最简单形式,当然还能根据使用场景增加其他判断条件.

用nginx搭建基于rtmp或者http的flv、mp4流媒体服务器

- - 开源软件 - ITeye博客
这种方式要下载FLV视频文件到本地播放,一旦FLV视频文件下载完成,就不会消耗服务器的资源和带宽,但是拖动功能没有RTMP/RTMP流媒体方式强大,很多视频网站都是用HTTP方式实现的,如:YouTube,土豆,酷6等. 2、  RTMP/RTMP流媒体方式. 这种方式不用下载FLV视频文件到本地,可以实时的播放flv文件,可以任意拖拽播放进度条,但是比较消耗服务器的资源.

NGINX的流媒体插件 nginx-rtmp-module

- - 开源软件 - ITeye博客
战斗民族俄罗斯人民开发的一款NGINX的流媒体插件,除了直播发布音视频流之外具备流媒体服务器的常见功能. 基于HTTP的FLV/MP4 VOD点播. HLS (HTTP Live Streaming) M3U8的支持. 基于http的操作(发布、播放、录制). 可以很好的协同现有的流媒体服务器以及播放器一起工作.

流媒体传输协议之 RTMP

- - SegmentFault 最新的文章
RTMP 在可靠流式传输(TCP)的基础上提供了双向的消息多路复用服务,在通讯双方之间传输与时间相关的并行流数据,如音频,视频和数据消息. 协议实现方通常为不同的消息类型指定不同的优先级,这样在网络带宽受限时能改变底层传输顺序. 包:一个数据包由固定头部和所承载的数据组成. 一些底层协议可能需要定义数据包的封装格式.

流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)

- - CSDN博客互联网推荐文章
          参考文档  RFC3550/RFC3551.          Real-time Transport Protocol)是用于Internet上针对多媒体数据流的一种传输层协议. RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式. RTP协议常用于流媒体系统(配合RTCP协议),视频会议和一键通(Push to Talk)系统(配合H.323或SIP),使它成为IP电话产业的技术基础.

Red5 1.0.1 Final 发布,Flash流媒体服务器

- - 开源中国社区最新新闻
Red5是一个采用Java开发开源的Flash流媒体服务器. 它支持:把音频(MP3)和视频(FLV)转换成播放流; 录制客户端播放流(只支持FLV);共享对象;现场直播流发布;远程调用. Red5使用RSTP作为流媒体传输协议,在其自带的一些示例中演示了在线录制,flash流媒体播放,在线聊天,视频会议等一些基本功能.

crtmpserver流媒体服务器的介绍与搭建

- - 互联网 - ITeye博客
      Adobe的FMS(Flash Media Server)是很好用. 但对应着分级授权的是money和有限功能开放. 商业的东西既然用不起,也阻碍了我们的技术进步,那就只能求助于开源社区了. 而crtmpserver就是FMS的替代者之一.     crtmpserver的功能总来说:.

JW Player 使用 RTMP 流

- - CSDN博客互联网推荐文章
        译序:JW Media Player 是开源的网页使用的 Flash 播放器. 本文采摘于 JW Player 的官方文档,讲解了 JW Player 对于 RTMP 的使用方法,我们可以从 JW Player 客户端的角度来了解 RTMP 协议.         RTMP ( Real Time Messaging Protocol 实时消息传输协议) 是一个用于将点播和直播媒体交付给 Adobe Flash 应用 (比如 JW Player) 的体系.

RTMP 协议学习总结

- - C++博客-牵着老婆满街逛
RTMP协议是一个互联网TCP/IP五层体系结构中应用层的协议. RTMP协议中基本的数据单元称为消息(Message). 当RTMP协议在互联网中传输数据的时候,消息会被拆分成更小的单元,称为消息块(Chunk). 消息是RTMP协议中基本的数据单元. 不同种类的消息包含不同的Message Type ID,代表不同的功能.