1、SIP和RTP加密需要关注两个方面的加密,一个方面是对SIP信令加密(SIP/TSL),包括对用户消息,SDP等文本消息加密,保证信令安全。另外一个加密就是对语音加密(SRTP),保证用户之间的语音流的安全。如果仅对SIP加密,不对RTP加密,则没有什么实际意义。
![](http://www.ctiforum.com/uploadfile/2017/1107/20171107022528302.jpg)
2、在SIP加密中,SIP使用了TLS来实现加密,读者可以看到加密锁介于应用层和传输层的,早期的加密使用的是SSL,TLS慢慢替代了SSL。TLS使用的是服务器和终端密码共享机制来实现传输。
![](http://www.ctiforum.com/uploadfile/2017/1107/20171107022709678.jpg)
这里,在使用TLS时需要有几个地方需要特别注意:
- 系统支持TLS和SSL时,首先使用的应该是TLS安全机制,但是如果客户端要求使用SSL,则也可以使用SSL 2.0。在RFC7586的标准中不推荐这样的处理机制。
- TSL两种处理机制的不同:对称和非对称处理方式。对称模式是双方共享一个密钥,处理速度比较快,占用资源比较少,操作简单,但是需要加密解密处理,另外,只能使用在已经创建的通信通道上,不同的密钥对不同的用户,不能对用户进行认证。
![](http://www.ctiforum.com/uploadfile/2017/1107/20171107022820584.jpg)
非对称方式可以支持密钥的不同发送,更加安全,也容易集成。但是,处理速度比较慢,另外需要消耗更多系统资源。
![](http://www.ctiforum.com/uploadfile/2017/1107/20171107022941307.jpg)
在上面我们已经提到了加密的各种优缺点,资源消耗是一个比较重要的话题。加密以后的系统性能可能会受影响。
![](http://www.ctiforum.com/uploadfile/2017/1107/20171107023243465.jpg)
以上数据是使用OpenSIPS的早期版本对认证/非认证模式,加密和不加密,使用UDP/TCP的吞吐量做的测试。读者可以看到,通过不同的配置方法会导致完全不同的结果,而且测试结果相差很多。
![](http://www.ctiforum.com/uploadfile/2017/1107/20171107023301530.jpg)
以上图例是OpenSIPS配置为一个outbound Proxy 环境下的吞吐量测试结果,读者可以看到,如果设置了TLS以后的差距。注意,此数据是介于OpenSIPS平台的早期版本做的测试,用户也调整了一些必要的参数来支持不同的TLS加密。目前OpenSIPS的性能和TSL版本都已经升级,服务器性能可能有所提升。关于如何进行测试,读者可以参考我们的链接资源,通过优化自己的平台来进一步提升TLS以后的性能。
TLS可以对SIP信令进行加密处理,也包括SDP的加密,这样就完全保证了信令的安全。
3、TSL可以支持端对端的加密,也可以支持通过跳转(Hop-by-Hop)的加密方式。端对端加密(End-to-End)则需要整个系统都使用TLS加密方式。
![](http://www.ctiforum.com/uploadfile/2017/1107/20171107023317408.jpg)
端对端的TLS加密方式操作比较简单,一般部署在集成商或者简单的电话系统中,这取决于部署需求。但是,它存在一些问题,例如,Proxy不能读取SIP消息,甚至告警消息。另外,因为已经SIP已经加密,运营商或者服务提供商所提供的服务可能不能到得完整的支持。最后,如果是跨国的服务的话,端对端的SIP加密是不允许的。
Hop By Hop加密方式是目前部署非常普遍的一种加密方式。从服务端角度来说,Hop By Hop的加密方式则相对比较好一点。如果遇到跨国的测试时,则可以取消加密,呼叫仍然可以正常工作。另外,Hop by Hop 的方式可以支持SIP修改一些SIP头参数,例如可以修改Record-Route 或Via 头域。
选择什么样的方式都是有成本的。两种加密方式同样会导致不同的语音数据结果,例如,丢包情况,和时延。以下图例是两种方式的延迟测试结果,希望读者要注意:
![](http://www.ctiforum.com/uploadfile/2017/1107/20171107023435170.jpg)
4、我们通过一个TLS对SIP加密的实例来说明整个TLS加密过程,大致流程和以前介绍的认证过程是基本相同的,这里仅介入了TLS的密钥交换:
![](http://www.ctiforum.com/uploadfile/2017/1107/20171107023507404.jpg)
这里,用户需要注意,如果需要对SIP整个路径加密,需要使用sips访问服务器地址,当然这里的端口是5061而不是默认的5060端口。例如,格式为:
sips:james@hiastar.com
另外,用户的SIP数据也可以实现部分安全加密,可以使用sip:方式来访问服务器或者IPPBX,因为B2BUA或者用户的IPPBX已经创建了介于运营商和本地服务器之间的TLS连接。
最后,在使用TLS时,如果使用sips访问服务器,那就说明用户使用TCP传输,而不是UDP测试。因为TLS要求使用TCP测试。很多时候,用户终端的传输方式没有做调整,也导致了很多类似常识性的错误发生。
5、关于SIP应用环境和TLS使用时的几个RFC标准的冲突。我们现在仅讨论了TLS和SIP加密的流程和基本原理。因为以前的传统PSTN环境中,几乎没有所谓的安全问题或安全机制的考虑。在SIP技术发展如此凶猛的市场中,事实上,在加密层面,基于SIP的标准就存在很多方面的冲突或者不统一,这样就导致了很多兼容性方面的问题,例如终端和服务器端的问题,服务器端到服务器端的问题,应用层面的TLS问题等争议。根据协议制定者的提议(具体提议内容参考链接),目前,各种RFC标准之间互相有冲突的结果方面包括:
- RFC 3261 要求 url支持,sip,sips,证书,hop by hop,但是如何让证书和主机关联是一个问题,也没有非常明确规定最后一个hop的处理。
- 对于TLS证书的使用上,RFC 3263要求的是Domain Name,而几乎同一时间发布的RFC3261则要求的是Host Name。这两个规范可能有冲突或歧义。
- RFC 5922中的Domain 证书问题,把authentication和authorization混合在了一起。
- RFC 5923 对TLS证书认证重新连接的问题没有解释清楚包括证书连接重用的问题。
- 如果TLS证书连接出现错误以后,没有比较清晰的错误码。
在本章节的讨论中,我们首先讨论了关于TLS的定义和使用方式,SIP加密的流程,使用TLS以后服务器的性能问题,TLS在不同标准中的一些争议。大家一定要注意使用TLS以后的性能问题,同时因为标准不同所产生的兼容性问题。最后,笔者还是建议读者更多参考RFC 3261,以RFC 3261为基本标准。
在接下来的讲座中,我们将继续讨论关于SIP安全的几个问题,SRTP,各种安全问题,防止手段和开源检查工具。
参考资料:
https://tools.ietf.org/html/rfc7568
http://www.cs.columbia.edu/~hgs/papers/Shen1008_TLS.pdf
https://www.acunetix.com/
https://www.cisco.com/c/en/us/about/press/internet-protocol-journal/back-issues/table-contents-45/123-security.html
关注微信号:asterisk-cn 获得更多行业技术信息,访问开源IPPBX网站获得开源IPPBX技术帮助和下载:www.issabel.cn/forum。