RTMP流媒体服务端应用开发系列 – Nginx-Rtmp鉴权设置 | 贝壳博客
鉴权验证在自建直播流媒体服务端应用中是非常重要的。用以防止非法推流,控制收费播放盗链等场景。
目前各大直播云平台都支持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,如果有再替换”+/”为 “-_”,如果有再删除”=”(比较繁琐)
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形式隐蔽。
原创文章,转载请注明:转载自 贝壳博客