TLS搭建即时通讯的安全通道
上篇博文中我们介绍了客户机如何利用LCS所提供的即时通讯功能,也让两个用户借助LCS服务器实现了即时通讯,只是在上篇博文中客户端连接服务器是基于未加密的TCP协议,安全方面不是很到位,也要顾忌恶意用户在内网对即时通讯数据进行嗅探。今天我们做些改进,让客户端连接服务器基于加密的TLS,这样就可以很好地保护即时通讯数据的安全。TLS是传输层加密的缩写,就是在传输层协议的基础上使用证书对数据进行加密保护,我们想要用TLS实现SIP,必须有证书服务器的配合。下面我们将通过一个实验向大家说明应该如何让这些服务器有条不紊地开展工作。实验拓扑如下图所示,我们准备让域控制器Florence承担CA服务器的角色,其余的环境和上篇博文完全一样。
 
安装证书服务器
TLS对即时通讯数据进行加密需要有证书服务器的支持,我们准备在Florence上安装证书服务器,类型最好选择企业根,因为企业根CA可以很好地和Active Directory结合,有助于提高管理效率。我们在Florence上打开控制面板-添加/或删除程序-添加/删除Windows组件,如下图所示,勾选“证书服务器”。
 
CA类型选择“企业根CA”。
 
CA命名为LCSCA,其余设置取默认值即可。
 
证书数据库路径取默认值即可。
 
如下图所示,证书服务器安装完成。
 
证书服务器安装完成后,域内其他的计算机需要信任这个证书服务器,如果有耐心,可以等待一下,最多不超多90分钟组策略就会通知域内所有的成员服务器和工作站信任LCSCA这个证书颁发机构。如果想让组策略尽快生效,可以如下图所示运行gpupdate/force,这样可以可以强制组策略立即生效。
 
组策略生效后,还要检查一下LCSCA到底有没有被当作可信任的证书颁发机构,如下图所示,如果LCSCA已经出现在受信任的根证书颁发机构中,那我们就可以放心地进行后续工作了。注意,一定要确保实验用的所有计算机都信任LCSCA
 
LCS服务器申请证书
创建了证书服务器,接下来我们就要在证书服务器上为LCS服务器申请证书了,在Berlin的浏览器中输入[url]http://florence/certsrv[/url],如下图所示,选择“申请一个证书”。
 
接下来选择提交一个“高级证书申请”。
 
选择“创建并向此CA提交一个申请”。
 
如下图所示,证书模板选择“Web服务器”,Web服务器可以证明LCS服务器的身份。证书要保存在计算机存储中,这样才可以被LCS服务器使用。证书姓名要取决于客户机访问LCS服务器时所使用的参数,由于客户机是通过DNS查询来定位LCS服务器,因此客户机连接服务器使用的是完全合格域名berlin.lcstest.com,我们为LCS服务器申请的证书姓名应该也是berlin.lcstest.com
 
申请证书后,证书服务器会立即颁发所申请的证书,如下图所示,选择“安装此证书”,就完成证书的申请了。
 
LCS服务器使用证书
LCS服务器申请证书后,就要利用申请到的证书配置TLS了。在Berlin的管理工具中打开“Live Communications Server 2005,如下图所示,我们发现目前Berlin只在5060端口提供TCP连接,右键点击Berlin.lcstest.com,选择属性。
 
LCS服务器属性中点击“添加”按钮。
 
如下图所示,为新添加的连接选择传输类型是TLS,端口是5061,点击“选择证书”。
 
选择使用刚申请到的证书berlin.lcstest.com,点击确定。
 
如下图所示,我们配置好了新添加的连接,点击确定结束。
 
如下图所示,LCS服务器已经可以在5061端口提供基于TLS的加密连接了。
 
配置SRV记录
现在LCS服务器可以提供TLS连接,但我们还要通过DNSSRV记录向LCS客户端传递这个消息,在DNS服务器上打开DNS管理器,如下图所示,右键点击lcstest.com区域,选择新建“其他新记录”。
 
选择创建SRV类型的新记录。
 
如下图所示,SRV记录描述了lcstest.com域中的berlin.lcstest.com5061端口可以提供基于TLSSIP服务,至此,SRV记录创建完毕。
 
客户机测试
万事俱备,只欠东风,我们可以在客户机上测试一下TLS的效果了。我们在Perth上关闭Windows Messenger,如下图所示,使用ipconfig/flushdns来清除DNS缓存, 免得查询不到DNS新增加的SRV记录。
 
清除DNS缓存后,我们让User1重新登录LCS服务器,如下图所示,User1已经成功登录LCS服务器,那么,客户端连接服务器使用的是TCP还是TLS呢?
 
如下图所示,我们在Perth上使用netstat –ano |find “5061”来查询perth5061端口的连接,从查询结果可以看出,perth正在连接LCS服务器的5061端口,客户端连接服务器使用的是基于TLS的加密连接,实验成功。这里有个问题,如果LCS服务器既提供TCP连接,又提供TLS连接,那么客户端会优先使用哪种连接呢?其实从上篇博文的抓包结果可以看出,客户端会优先使用安全性更高的TLS连接。