Adobe的FMS服务器支持推流时用户名+密码认证,这样保证了推流的安全性。
由于Adobe的推流认证的方法与过程在Adobe公开的RTMP协议说明文档里没有,只能根据逆向工程分析它的过程。
FMS支持两种推流认证,即adobe与llnw。本人对adobe方式进行了分析记录如下:
一、用户帐号产生方法:
Adobe FMS启用了认证以后,在FMS的安装目录的conf字幕里里会多出一个users.exe程序,用于产生用户数据库, users.dat文件为用户数据库文件。用users.exe程序添加一个用户, 用户名为 user2020,密码为 123456:
>users add -u user2020 -p 123456
在users.dat里将增加一条记录如下:
user2020:8wsAAA==:ICbruj1yNoAtrODdBhFTSQ==
这条用户帐户信息用冒号分割了3个段,其中:
第一段 “user2020”:为原始输入的用户名
第二段 “8wsAAA==”:为salt(盐),一个32位随机整数的base64值
第三段 “ICbruj1yNoAtrODdBhFTSQ==”:为HASH值,算法为 md5(username + salt + password)
二、媒体服务器与推流端的认证过程
如果FMS被配置成启用推流认证,则推流端在推流时需要认证,认证过程是一个交互过程,可能有2-3次交互。经过笔者跟踪分析的步骤如下(一个正常认证的过程):
2.1 如果推流端在发起连接时没有携带认证信息,则FMS响应如下:
[ AccessManager.Reject ] : [ code=403 need auth; authmod=adobe ] :
2.2 然后,如果推流端支持推流认证,则推流端回应如下:
rtmp://serverip/live?authmod=adobe&user=user2020
2.3 如果服务器端判断用户存在,则响应如下:
[ AccessManager.Reject ] : [ authmod=adobe ] : ?reason=needauth&user=user2020&salt=8wsAAA==&challenge=OzMAAA==&opaque=OzMAAA==
2.4推流端根据服务器响应,将密码信息回馈给服务器,回馈如下:
rtmp://serverip/live?authmod=adobe&user=user2020&challenge=KQAAAA==&response=2R7VMEl1wWPJWTom1Ca9hw==&opaque=5gUAAA==
至此,推流认证过程完成了。
如果推流认证失败,服务器端可能会回馈以下响应:
[ AccessManager.Reject ] : [ authmod=adobe ] : ?reason=nosuchuser&opaque=OTIAAA==
[ AccessManager.Reject ] : [ authmod=adobe ] : ?reason=authfailed&opaque=OzMAAA==
经过笔者测试,目前国内开发流媒体的服务器的厂家(包括几大云服务商)都没有支持Adobe推流认证,目前通过Flash Media Live Encoder 3.2 测试通过的的流媒体服务器只有 Adobe FMS、Wowza与 iAVCast Media Server。