https的认证过程
① 浏览器发送一个连接请求给安全服务器。
② 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器。
③ 客户浏览器检查服务器送过来的证书是否是由自己信赖的 CA 中心所签发的。如果是,就继续执行协议;如果不是,客户浏览器就给客户一个警告消息:警告客户这个证书不是可以信赖的,询问客户是否需要继续。
④ 接着客户浏览器比较证书里的消息,例如域名和公钥,与服务器刚刚发送的相关消息是否一致,如果是一致的,客户浏览器认可这个服务器的合法身份。
⑤ 服务器要求客户发送客户自己的证书。收到后,服务器验证客户的证书,如果没有通过验证,拒绝连接;如果通过验证,服务器获得用户的公钥。
⑥ 客户浏览器告诉服务器自己所能够支持的通讯对称密码方案。
⑦ 服务器从客户发送过来的密码方案中,选择一种加密程度最高的密码方案,用客户的公钥加过密后通知浏览器。
⑧ 浏览器针对这个密码方案,选择一个通话密钥,接着用服务器的公钥加过密后发送给服务器。
⑨ 服务器接收到浏览器送过来的消息,用自己的私钥解密,获得通话密钥。
⑩ 服务器、浏览器接下来的通讯都是用对称密码方案,对称密钥是加过密的。
① 客户端的浏览器向服务器传送客户端SSL协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种信息。
② 服务器向客户端传送SSL协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书。
③ 客户利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的CA是否可靠,发行者证书的公钥能否正确解开服务器证书的"发行者的数字签名", 服务器证书 上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开;如果合法性验证通过,将继续进行第四步。
④ 用户端随机产生一个用于后面通讯的"对称密码",然后用服务器的公钥(服务器的公钥从步骤②中的服务器的证书中获得)对其加密,然后将加密后的"预主密码"传给服务器。
⑤ 如果服务器要求客户的身份认证(在握手过程中为可选),用户可以建立一个随机数然后对其进行数据签名,将这个含有签名的随机数和客户自己的证书以及加密过的"预主密码"一起传给服务器。
⑥ 如果服务器要求客户的身份认证,服务器必须检验客户证书和签名随机数的合法性,具体的合法性验证过程包括:客户的证书使用日期是否有效,为客户提供证书的CA是否可靠,发行CA 的公钥能否正确解开客户证书的发行CA的数字签名,检查客户的证书是否在证书废止列表(CRL)中。检验如果没有通过,通讯立刻中断;如果验证通过,服务器将用自己的私钥解开加密的"预主密码 ",然后执行一系列步骤来产生主通讯密码(客户端也将通过同样的方法产生相同的主通讯密码)。
⑦ 服务器和客户端用相同的主密码即"通话密码",一个对称密钥用于SSL协议的安全数据通讯的加解密通讯。同时在SSL通讯过程中还要完成数据通讯的完整性,防止数据通讯中的任何变化。
⑧客户端向服务器端发出信息,指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥,同时通知服务器客户端的握手过程结束。
⑨ 服务器向客户端发出信息,指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥,同时通知客户端服务器端的握手过程结束。
⑩ SSL的握手部分结束,SSL安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验。
① 浏览器发送请求给服务器,服务器首先返回证书;
② 浏览器比对服务器返回证书是否由信赖的CA中心签发,以及证书里的消息如:域名和公钥,通过后证明此服务器是安全的目标服务器,此时浏览器得到服务器的公钥;
③ 浏览器发送客户端证书给服务器进行验证,通过后建立连接,此时服务器获得客户端的公钥;
④ 客户端用各自的公钥、私钥发送对称秘钥,之后的通信就用对称秘钥进行加解密。(公钥和私钥为不对称秘钥,性能开销大于对称秘钥)
① 如双向认证前两步一样;
② 客户端用服务端公钥传送对称秘钥, 后续就用对称秘钥进行加解密再传送数据。
参考资料:
dns攻击主要有以下这几种方式:
DNS缓存感染
攻击者使用DNS请求,将数据放入一个具有漏洞的的DNS服务器的缓存当中。这些缓存信息会在客户进行DNS访问时返回给用户,从而把用户客户对正常域名的访问引导到入侵者所设置挂马、钓鱼等页面上,或者通过伪造的邮件和其他的server服务获取用户口令信息,导致客户遭遇进一步的侵害。
DNS信息劫持
TCP/IP体系通过序列号等多种方式避免仿冒数据的插入,但入侵者如果通过监听客户端和DNS服务器的对话,就可以猜测服务器响应给客户端的DNS查询ID。每个DNS报文包括一个相关联的16位ID号,DNS服务器根据这个ID号获取请求源位置。攻击者在DNS服务器之前将虚假的响应交给用户,从而欺骗客户端去访问恶意的网站。假设当提交给某个域名服务器的域名解析请求的DNS报文包数据被截获,然后按截获者的意图将一个虚假的IP地址作为应答信息返回给请求者。原始请求者就会把这个虚假的IP地址作为它所要请求的域名而进行访问,这样他就被欺骗到了别处而无妨连接想要访问的那个域名。
DNS重定向
攻击者将DNS名称查询重定向到恶意DNS服务器上,被劫持域名的解析就完全在攻击者的控制之下。
ARP欺骗
ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞,攻击者只要持续不断的发出伪造的ARP响应包就能更改目标主机ARP缓存中的IP-MAC条目,造成网络中断或中间人攻击。ARP攻击主要是存在于局域网网络中,局域网中若有一台计算机感染ARP病毒,则感染该ARP病毒的系统将会试图通过”ARP欺骗”手段截获所在网络内其它计算机的通信信息,并因此造成网内其它计算机的通信故障。
ARP欺骗通常是在用户局网中,造成用户访问域名的错误指向。如果IDC机房也被ARP病毒入侵后,则也可能出现攻击者采用ARP包压制正常主机、或者压制DNS服务器,以使访问导向错误指向的情况。
本机劫持
本机的计算机系统被木马或流氓软件感染后,也可能会出现部分域名的访问异常。如访问挂马或者钓鱼站点、无法访问等情况。本机DNS劫持方式包括hosts文件篡改、本机DNS劫持、SPI链注入、BHO插件等方式。
防范Arp攻击、采用UDP随机端口、建立静态IP映射、运行最新版本的BIND、限制查询、利用防火墙进行保护、利用交叉检验、使用TSIG机制、利用DNSSEC机制。
下面分别做出说明。
防范Arp攻击
主要是针对局域网的DNS ID欺骗攻击。如上所述,DNS ID欺骗是基于Arp欺骗的,防范了Arp欺骗攻击,DNS ID欺骗攻击是无法成功实施的。
采用UDP随机端口
不再使用默认的53端口查询,而是在UDP端口范围内随机选择,可使对ID与端口组合的猜解难度增加6万倍,从而降低使DNS缓存攻击的成功率。
建立静态IP映射
主要是指DNS服务器对少部分重要网站或经常访问的网站做静态映射表,使对这些网站的访问不再需要经过缓存或者向上一级的迭代查询,从而在机制上杜绝DNS欺骗攻击。
运行最新版本的BIND
使用最新版本的BIND,可以防止已知的针对DNS软件的攻击(如DoS攻击、缓冲区溢出漏洞攻击等)。应密切关注BIND安全公告,及时打好补丁。
限制查询
在BIND8和BIND9之后,BIND的allow-query子句允许管理员对到来的查询请求使用基于IP地址的控制策略,访问控制列表可以对特定的区甚至是对该域名服务器受到的任何查询请求使用限制策略。如限制所有查询、限制特定区的查询、防止未授权的区的查询、以最少权限运行BIND等。
利用防火墙进行保护
这种保护方式可以使受保护的DNS服务器不致遭受分布式拒绝服务攻击、软件漏洞攻击。原理是在DNS服务器主机上建立一个伪DNS服务器共外部查询,而在内部系统上建立一个真实的DNS服务器专供内部使用。配置用户的内部DNS客户机,用于对内部服务器的所有查询,当内部主机访问某个网站时,仅当内部DNS服务器上没有缓存记录时,内部DNS才将查询请求发送到外部DNS服务器上,以保护内部服务器免受攻击。
利用交叉检验
这种保护方式可以从一定程度上防范DNS欺骗攻击。原理是反向查询已得到的IP地址对应的主机名,用该主机名查询DNS服务器对应于该主机名的IP地址,如果一致,则请求合法,否则非法。
使用TSIG机制
TSIF(事物签名)机制(RFC2845)通过使用共享密钥(Secret Key)及单向散列函数(One-way hash function)提供信息的验证以及数据的完整性。当配置了TSIG后,DNS消息会增加一个TSIF记录选项,该选项对DNS消息进行签名,为消息发送者和接受者提供共享密钥,从而保证了传输数据不被窃取和篡改。TSIP机制的部署步骤不做赘述,相关RFC文档有详细说明。
利用DNSSEC机制
为保证客户机发送的解析请求的完整性,保护DNS服务器及其中的信息,防止入侵者冒充合法用户向他人提供虚假DNS信息,IETF(网络工程任务组)提出了DNS安全扩展(DNSSEC)的安全防范思想。
1、 DNSSEC工作原理
为提高DNS访问数据包的安全性,DNSSEC在兼容现有协议的基础上引入加密和认证体系,在每个区域都有一对区域级的密钥对,密钥对中的公钥对域名记录信息进行数字签名,从而使支持DNSSEC的接收者可以校验应答信息的可靠性。
BIND90支持DNS的安全扩展功能。DNSSEC引入两个全新的资源记录类型:KEY和SIG,允许客户端和域名服务器对任何DNS数据来源进行密钥验证。DNSSEC主要依靠公钥技术对于包含在DNS中的信息创建密钥签名,密钥签名通过计算出一个密钥Hash数来提供DNS中数据的完整性,并将该Hash数封装进行保护。私/公钥对中的私钥用来封装Hash数,然后可以用公钥把Hash数翻译出来。如果这个翻译出的Hash值匹配接收者计算出来的Hash数,那么表明数据是完整的、没有被篡改的。
2、 DNSSEC的实施
1)、创建一组密钥对
#cd/vat/named
#dnssec -keygen -a RSA -b 512 -n ZONE qfnueduKqfnuedu+002+27782
2)、生成密钥记录
#dnssec –makekeyset -t 172802 I
3)、发送密钥文件到上一级域管理员,以供签名使用
#dnssec -signkey keyset -qfnuedu Kedu+002+65396private
然后将返回qfnuedusignedkey文件
4)、在进行区域签名之前,必须先将密钥记录添加到区域数据文件之中
#cat“$include Kqfnnedu+002+27782key”>>dbqfnuedu
5)、对区域进行签名
#dnssec –signzone -O qfnuedu dbqfnuedu
6)、修改namedconf里的zone语句,系统将会载新的区域数据文件
3、 DNSSEC的不足
一方面,DNSSEC安全性虽然有所提高,但是标记和校验必然产生额外的开销,从而影响网络和服务器的性能,签名的数据量很大,家中了域名服务器对骨干网以及非骨干网连接的负担,同时简明校验也对CPU造成了很大的负担,同时签名和密钥也占用了占用的磁盘空间以及RAM容量。
另一方面,安全性能方面的考虑。绝大多数的DNS软件是美国出口的,它们为了通过美国政府的安全规定而被迫降低加密算法和过程的安全强度。
第三方面,RSA算法的使用。RSA拥有美国专利,与某些厂商和组织倡导的“免费/开放”目标有所冲突,但是同时又别无选择。在成本方面也是部署中的一个问题。
你熟悉socket
API不?如果不熟悉的话建议先看看socket编程的文档。这是链接地址:http://msdnmicrosoftcom/en-us/library/ms738545(v=VS85)aspx
一般服务端的sokcet
API调用顺序为:
bind()
//
设置服务端口
listen()
//
等待客户端连接
accept()
//
与客户端建立连接
请参考:http://msdnmicrosoftcom/en-us/library/ms737526(v=VS85)aspx
这是accept函数的原型:
SOCKET
accept(
__in
SOCKET
s,
__out
struct
sockaddr
addr,
__inout
int
addrlen
);
第二个参数,
addr,包含了客户端的IP地址和端口。你可以认为这就是客户端的IP和端口。但是,要注意的是这个IP不一定就完全等价于客户端本机的端口。比如:客户端在一个局域网里,IP地址是1921681100,然后它通过ADSL路由连接到internet,再通过internet连接到服务端。这个时候,服务端获得的客户端IP地址就可能是那个ADSL路由的IP。
0条评论