如何使用secureToken对rtmp流进行保护?
转载请注明:文章来自www.wowza.cn
注意: 要访问最新的技术资料,请访问http://www.ttstream.com/wowza/
SecureToken是一个基于盘问/响应机制的安全系统,它提供了一个高层面的内容保护机制,当它和Wowza StreamLock™ 插件(RTMPS)、RTMPE或RTMPTE技术一起使用时,可以有效地抵抗各种欺骗性质的内容请求(例如那些使用Replay Media Catcher和Grab Pro发出的连接请求)。 它通过一个唯一随机字符串(key)和一个密码(共享密钥)对每一个连接进行保护。 www.wowza.cn

注意: SecureToken 功能已经内建在Wowza Media Server® 3.5.0及更高版本了。如果你正在使用更早版本的Wowza Media Server,你必须通过下载MediaSecurity 插件包 得到这个模块。下载并解开MediaSecurity插件压缩包后, 将/lib文件夹下的wms-plugin-security.jar文件拷贝到Wowza Media Server安装路径的/lib文件夹下,然后重启Wowza Media Server。

概要


当Adobe® Flash®客户端请求连接Wowza Media Server时,SecureToken模块会为这个连接会话(Session)生成一个唯一随机字符串。这个字符串被一个共享密钥加密后作为NetConnection.onStatus信息的一部分返回给客户端。Flash客户端用同样的共享密钥将这个信息解密后,会得到来自Wowza Media Server的唯一随机字符串,然后将结果发送给Wowza Media Server的SecureToken模块,这个模块将收到的唯一随机字符串与之前产生的唯一随机字符串做比较,如果不匹配,这个连接将被中止。

SecureToken安全机制被包含在ModuleSecureTokenModuleRTMPAuthenticate模块中。要了解更多关于ModuleRTMPAuthenticate 模块的信息, 请阅读如何采用用户名和密码认证机制对RTMP和RTSP推流进行认证(ModuleRTMPAuthenticate)

在服务器上配置SecureToken功能


要在服务器上配置SecureToken功能,按如下的操作进行:

  1. 参照快速上手配置一个直播或点播应用。

  2. 用文本编辑器打开[install-dir]/conf/[application]/Application.xml文件,在<Modules>列表的最后加上下面的<Module>:
    Code:
    <Module>
    	<Name>ModuleSecureToken</Name>
    	<Description>ModuleSecureToken</Description>
    	<Class>com.wowza.wms.security.ModuleSecureToken</Class>
    </Module>
    注意: 如果你正在使用Wowza Media Server 3.1.2或更早的版本,你需要在<Modules>列表的最后加上下面的<Module>(替换上面的模块):
    Code:
    <Module>
    	<Name>ModuleSecureToken</Name>
    	<Description>ModuleSecureToken</Description>
    	<Class>com.wowza.wms.plugin.security.ModuleSecureToken</Class>
    </Module>
    www.wowza.cn

    注意:如果你已经在使用ModuleRTMPAuthenticate 模块对RTMP推流进行认证,你不需要在<Modules>列表中添加ModuleSecureToken模块。因为ModuleRTMPAuthenticate 模块已经包含了对SecureToken的支持。

  3. Application.xml文件的最下面的<Properties>中添加一个应用层面的属性参数:
    Code:
    <Property>
    	<Name>secureTokenSharedSecret</Name>
    	<Value>[secure-token-secret]</Value>
    </Property>
    用你自己的SecureToken共享密钥替换 [secure-token-secret]。例如:
    Code:
    <Property>
    	<Name>secureTokenSharedSecret</Name>
    	<Value>#ed%h0#w@1</Value>
    </Property>
    www.wowza.cn
  4. 要使用安全连接(RTMPS, RTMPE, or RTMPTE)来请求内容,在Application.xml文件最下面的<Properties>列表中添加一个应用层面的属性参数<Properties>:
    Code:
    <Property>
    	<Name>requireSecureConnection</Name>
    	<Value>true</Value>
    	<Type>Boolean</Type>
    </Property>

在Flash客户端配置SecureToken


要使用SecureToken安全功能,你的ActionScript®的客户端播放代码需要做一些调整,以让它能够对SecureToken盘问做出正确的响应。下面的代码展示了在Flash客户端中如何使用这个功能。

为了展示如何将SecureToken集成到你的客户端ActionScript代码中,我们假定在服务端使用ModuleSecureToken模块对流提供保护的应用名为live,并且secureTokenSharedSecret的属性参数被设置为mytestpassword

Flash客户端的代码如下:
Code:
import com.meychi.ascryptAS3.TEA;

var nc:NetConnection = new NetConnection();

function ncOnStatus(infoObject:NetStatusEvent)
{
	if (infoObject.info.code == "NetConnection.Connect.Success")
	{
		if (infoObject.info.secureToken != null)
			nc.call("secureTokenResponse", null, TEA.decrypt(infoObject.info.secureToken, "mytestpassword"));
	}
}

nc.addEventListener(NetStatusEvent.NET_STATUS, ncOnStatus);
nc.connect("rtmp://localhost/vod");
www.wowza.cn
代码的第一行引入了TEA 类库,用于对SecureToken机制中的token进行的解密。在ActionScript 2.0 和 3.0 版本的这段代码已经被包含压缩包: ActionScriptTEA.zip中了。

如果你计划将这个代码集成进入你的播放器,你需要将这些类拷贝到你的Flash客户端代码中。

接下来, 我们需要定义并创建一个NetConnection对象,用于与Wowza Media Server通讯。接着是一个NetConnection onStatus 方法,它将在NetConnection对象的生命周期内被调用。然后我们将onStatus作为一个监听器添加到NetConnection对象,最后用NetConnection.connect(url) 建立与Wowza Media Server的连接。

NetConnection 对象与Wowza Media Server建立起一个连接后,onStatus 方法将被调用,同时一个值为NetConnection.Connection.Success的参数infoObject.info.code将被参数传递进入这个方法。如果服务器使用了SecureToken来提供保护,那么infoObject.info 对象将同时包含一个secureToken 字段。在这个盘问的响应中,Flash客户端代码调用了一个远程方法secureTokenResponse ,第一个参数为解密后的令牌(token)。你可以看到令牌(token)被下面的方法解密:
Code:
TEA.decrypt(infoObject.info.secureToken, "mytestpassword")
这就是为了实现盘问和响应流程,所有你所需要做的。在这个调用secureTokenResponse之后,连接将被服务端认证,剩下的Flash代码正常往下执行即可。如果在Flash客户端代码的playpublish方法之前没有调用secureTokenResponse, Wowza Media Server 将终端连接。

从Wowza Media Server 3.5版本开始, SecureToken 的客户端代码已经被集成进入LiveVideoStreamingVideoOnDemandStreaming 的例子播放器中了。此外,SecureToken功能已经被集成到了好几个开放源代码的播放器(例如JW Player和FlowPlayer)中了。