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处理上来

rtmp { server { listen 1935; application play { live on; notify_method get; on_play http://127.0.0.1/on_play; } } }
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

http { server { listen 80; set $auth_key "nodemedia2016"; location /on_play { secure_link $arg_key,$arg_time; secure_link_md5 "$auth_key$arg_time"; if ($secure_link = "") { return 404;#验证失败 } if ($secure_link = "0") { return 410;#验证成功,但时间失效 } return 200; } } }
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
echo -n 'nodemedia20161469350860' | \ openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =
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流媒体服务端应用开发系列 – Nginx-Rtmp鉴权设置 | 贝壳博客)