现在的位置: 首页 > 综合 > 正文

openfire connection manager tls 配置

2013年10月11日 ⁄ 综合 ⁄ 共 5460字 ⁄ 字号 评论关闭

最近项目(基于openfire)里需要用tls,为了方便以后的工作,这里简单做一下记录,不罗嗦直接进入正题。

说到tls,我们就要问问为什么需要tls,原因无非是保证客户端和服务器交互的安全性。我们使用tls最初只是为了加密通信通道,后来又需要增加一个tls证书认证,让保证客户端收到的连接一定是我们的服务器发出的,也就是防止域名劫持,说到域名劫持那么我们就得了解一下DNS协议,以及域名劫持是如何发生的。下面我们就一步一步的进行一下简单的介绍。

DNS协议

参考:计算机网络 谢希仁 第5版

域名系统DNS(Domain Name System)是因特网使用的命名系统,用来把人们使用的机器名字转换为IP地址,为什么机器在处理IP数据报的时候要使用IP地址而不适用域名呢?这是因为IP地址的长度是固定的32位(IPV6是128位,也是定长的),而域名的长度是不固定的,机器使用起来比较困难。早在ARPANET时代,整个网络上都只有几百台计算机,那时候使用一个叫做hosts的文件保存域名和IP地址的映射就足够了,理论上讲,整个因特网可以只使用一个域名服务器来保存所有的域名和IP地址的映射关系就可以了,但是随着因特网的快速发展,网络上的机器数量已经大到单个服务器无法承载了,所以域名管理系统也就应运而生了。DNS系统是一个联机分布式数据库系统,采用客户服务器方式。DNS使大多数名字都在本地进行解析,仅仅只有少量的解析需要在因特网上通信,因此DNS系统的效率是很高的。而且由于这个系统是分布式的,即使系统中的某一个服务器出现了故障也不会影响系统的正常运行。

域名到IP的解析过程要点如下:当某个应用进程需要把主机名解析为IP地址时,该应用程序就调用解析程序,并成为一个DNS客户,把带解析的域名放到DNS报文中,以UDP用户数据报方式发给本地的域名服务器,本地域名服务器在查找域名之后把对应的IP地址放在应答报文中返回。详细的根域名,子域名,根域名服务器,代理授权域名服务器这些内容这里就不啰嗦详述了,我们直接来看看域名服务器的工作方式:

迭代查询

迭代查询过程:

1:主机m.xyz.com先向本地域名服务器dns.xyz.com进行查询

2:本地域名服务器采用迭代查询,它先向一个根域名服务器查询

3:根域名服务器告诉本地域名服务器,下一次应该查询顶级域名服务器dns.com的ip地址

4:本地域名服务器向顶级域名服务器dns.com进行查询

5:顶级域名服务器dns.com告诉本地域名服务器下一次应该查询的权限域名服务器dns.abc.com的ip地址

6:本地域名服务器向权限域名服务器dns.abc.com查询

7:权限域名服务器告诉本地域名服务器,所查询的主机的ip地址

8:本地域名服务器把查询结果返回给查询者

递归查询



递归查询时,本地域名服务器只需向根域名服务器查询一次,后面的几次查询都是在其他的域名服务器之间进行的,本地域名服务器从根域名服务器得到查询的ip地址。

为了提高DNS的查询效率,并减轻根域名服务器的压力和减少因特网上的DNS查询报文的数量,在域名服务器中广泛的使用了高速缓存,缓存用来存放最近查询过的域名以及从何处获得域名映射信息的记录。例如在上图迭代查询中,如果在不久前已经有用户查询过域名y.abc.com的ip地址,那么本地域名服务器就不需要向根域名服务器重新查询y.abc.com的ip地址,而是直接把缓存中上次查询的结果告诉用户。假如本地域名服务器中没有缓存y.abc.com的ip地址,而是存放着顶级域名服务器dns.com的ip地址,那么本地域名服务器也可以不向根域名服务器进行查询,而是直接向顶级域名服务器发生查询请求。这样不仅可以减轻根域名服务器的压力,而且还可以大大减少网络上的报文。由于缓存是有有效时间的,如果所有的有关的缓存信息都已经过期不存在了,那么就必须走完迭代查询的所有过程(如果使用迭代查询)。不但在本地域名服务器中需要缓存,在主机中也很需要。许多主机在启动时从本地域名服务器下载名字和地址的全部数据库,维护存放自己最近使用的域名的缓存,并且只在本地缓存中找不到记录是才使用域名服务器。

简单了解了DNS,我们再来看看DNS劫持是如何发生的(一下内容来自百度百科)
域名劫持就是在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则直接返回假的IP地址或者什么也不做使得请求失去响应,其效果就是对特定的网址不能访问或访问的是假网址。
域名解析(DNS)的基本原理是把网络地址(域名,以一个字符串的形式,比如
www。google。com)对应到真实的计算机能够识别的
网络地址(IP地址,比如216.239.53.99
这样的形式),以便计算机能够进一步通信,传递网址和内容等。

由于域名劫持往往只能在特定的被劫持的网络范围内进行,所以在此范围外的域名服务器(DNS)能够返回正常的IP地址,高级用户可以在网络设置把DNS指向这些正常的域名服务器以实现对网址的正常访问。所以域名劫持通常相伴的措施——封锁正常DNSIP
如果知道该域名的真实IP地址,则可以直接用此IP代替域名后进行访问。比如访问http://www。google。com/
,可以把访问改为http://216.239.53.99/ ,从而绕开
域名劫持。
过程:
由于域名劫持只能在特定的网络范围内进行,所以范围外的域名服务器(DNS)能返回正常IP地址。攻击者正是利用此点在范围内封锁正常DNS的IP地址,使用域名劫持技术,通过冒充原域名以E-MAIL方式修改公司的注册域名记录,或将域名转让到其他组织,通过修改注册信息后在所指定的DNS服务器加进该域名记录,让原域名指向另一IP的服务器,让多数网民无法正确访问,从而使得某些用户直接访问到了恶意用户所指定的域名地址,其实施步骤如下:
一、获取劫持域名注册信息:首先攻击者会访问域名查询站点,通过MAKE
CHANGES功能,输入要查询的域名以取得该域名注册信息。

二、控制该域名的E-MAIL帐号:此时攻击者会利用社会工程学或暴力破解学进行该E-MAIL密码破解,有能力的攻击者将直接对该E-MAIL进行入侵行为,以获取所需信息。
三、修改注册信息:当攻击者破获了E-MAIL后,会利用相关的MAKE CHANGES功能修改该域名的注册信息,包括拥有者信息,DNS服务器信息等。

四、使用E-MAIL收发确认函:此时的攻击者会在信件帐号的真正拥有者之前,截获网络公司回溃的网络确认注册信息更改件,并进行回件确认,随后网络公司将再次回溃成攻修改信件,此时攻击者成功劫持域名
(以前项目发生过域名劫持,不过是由于提供域名服务的运营商工作人员手动修改了我们的域名映射造成的)
tls协商过程简介
1、基础知识

    这部分内容主要解释一些概念和术语,最好是先理解这部分内容。

1.1、公钥密码体制(public-key cryptography)

    公钥密码体制分为三个部分,公钥私钥、加密解密算法,它的加密解密过程如下:

  • 加密:通过加密算法公钥对内容(或者说明文)进行加密,得到密文。加密过程需要用到公钥
  • 解密:通过解密算法私钥密文进行解密,得到明文。解密过程需要用到解密算法私钥。注意,公钥加密的内容,只能由私钥进行解密,也就是说,由公钥加密的内容,如果不知道私钥,是无法解密的。

    公钥密码体制公钥和算法都是公开的(这是为什么叫公钥密码体制的原因),私钥是保密的。大家都以使用公钥进行加密,但是只有私钥的持有者才能解密。在实际的使用中,有需要的人会生成一对公钥私钥,把公钥发布出去给别人使用,自己保留私钥

1.2、对称加密算法(symmetric key algorithms)

    对称加密算法中,加密使用的密钥和解密使用的密钥是相同的。也就是说,加密和解密都是使用的同一个密钥。因此对称加密算法要保证安全性的话,密钥要做好保密,只能让使用的人知道,不能对外公开。这个和上面的公钥密码体制有所不同,公钥密码体制中加密是用公钥,解密使用私钥,而对称加密算法中,加密和解密都是使用同一个密钥,不区分公钥私钥

    // 密钥,一般就是一个字符串或数字,在加密或者解密时传递给加密/解密算法。前面在公钥密码体制中说到的公钥私钥就是密钥公钥是加密使用的密钥私钥是解密使用的密钥

1.3、非对称加密算法(asymmetric key algorithms)

    非对称加密算法中,加密使用的密钥和解密使用的密钥是不相同的。前面所说的公钥密码体制就是一种非对称加密算法,他的公钥和是私钥是不能相同的,也就是说加密使用的密钥和解密使用的密钥不同,因此它是一个非对称加密算法

1.4、RSA简介

    RSA是一种公钥密码体制,现在使用得很广泛。如果对RSA本身有兴趣的,后面看我有没有时间写个RSA的具体介绍。

    RSA密码体制是一种公钥密码体制,公钥公开,私钥保密,它的加密解密算法是公开的。
公钥加密的内容可以并且只能由私钥进行解密,并且由私钥加密的内容可以并且只能由公钥进行解密。也就是说,RSA的这一对公钥、私钥都可以用来加密和解密,并且一方加密的内容可以由并且只能由对方进行解密

1.5、签名和加密

    我们说加密,是指对某个内容加密加密后的内容还可以通过解密进行还原。
比如我们把一封邮件进行加密,
加密后的内容在网络上进行传输,接收者在收到后,通过解密可以还原邮件的真实内容。

这里主要解释一下签名签名就是在信息的后面再加上一段内容,可以证明信息没有被修改过,怎么样可以达到这个效果呢?一般是对信息做一个hash计算得到一个hash值,注意,这个过程是不可逆的,也就是说无法通过hash值得出原来的信息内容。在把信息发送出去时,把这个hash值加密后做为一个签名信息一起发出去。
接收方在收到
信息后,会重新计算信息的hash值,并和信息所附带的hash值(解密后)进行对比,如果一致,就说明信息的内容没有被修改过,因为这里hash计算可以保证不同的内容一定会得到不同的hash值,所以只要内容一被修改,根据信息内容计算的hash值就会变化。当然,不怀好意的人也可以修改信息内容的同时也修改hash值,从而让它们可以相匹配,为了防止这种情况,hash值一般都会加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改。至于如何让别人可以解密这个签名,这个过程涉及到数字证书等概念,我们后面在说到数字证书时再详细说明,这里您先只需先理解签名的这个概念。

2、一个加密通信过程的演化

    我们来看一个例子,现在假设“服务器”和“客户”要在网络上通信,并且他们打算使用RSA(参看前面的RSA简介)来对通信进行加密以保证谈话内容的安全。由于是使用RSA这种公钥密码体制,“服务器”需要对外发布公钥(算法不需要公布,RSA的算法大家都知道),自己留着私钥。“客户”通过某些途径拿到了“服务器”发布的公钥,客户并不知道私钥。“客户”具体是通过什么途径获取公钥的,我们后面再来说明,下面看一下双方如何进行保密的通信:

2.1 第一回合:

“客户”->“服务器”:你好

“服务器”->“客户”:你好,我是服务器

“客户”->“服务器”:????

    因为消息是在网络上传输的,有人可以冒充自己是“服务器”来向客户发送信息。例如上面的消息可以被黑客截获如下:

“客户”->“服务器”:你好

“服务器”->“客户”:你好,我是服务器

“客户”->“黑客”:你好        //
黑客在“客户”和“服务器”之间的某个路由器上截获“客户”发给服务器的信息,然后自己冒充“服务器”

“黑客”->“客户”:你好,我是服务器

    因此“客户”在接到消息后,并不能肯定这个消息就是由“服务器”发出的,某些“黑客”也可以冒充“服务器”发出这个消息。如何确定信息是由“服务器”发过来的呢?有一个解决方法,因为只有服务器有私钥,所以如果只要能够确认对方有私钥,那么对方就是“服务器”。因此通信过程可以改进为如下:

2.2 第二回合:

“客户”->“服务器”:你好

“服务器”->“客户”:你好,我是服务器

“客户”->“服务器”:向我证明你就是服务器

“服务器”->“客户”:你好,我是服务器 {你好,我是服务器}[私钥|RSA]

    // 意这里约定一下,{}
表示RSA加密后的内容,[ | ]表示用什么密钥和算法进行加密,后面的示例中都用这种表示方式,例如上面的
{你好,我是服务器}[私钥|RSA] 
就表示用
私钥
“你好,我是服务器”进行加密后的结果。

    为了向“客户”证明自己是“服务器”, “服务器”把一个字符串用自己的私钥加密,把明文和加密后的密文一起发给“客户”。对于这里的例子来说,就是把字符串 “你好,我是服务器”和这个字符串用私钥加密后的内容 {你好,我是男人}[私钥|RSA] 发给客户。

    “客户”收到信息后,她用自己持有的公钥解密密文,和明文进行对比,如果一致,说明信息的确是由男人发过来的。也就是说“客户”把 {你好,我是服务器}[私钥|RSA] 这个内容用公钥进行解密,然后和“你好,我是服务器”对比。因为用“服务器”用

抱歉!评论已关闭.