https原理和建立的过程

来源:互联网 发布:天恒php时时彩源码 编辑:程序博客网 时间:2024/06/07 04:09

http的缺点:

1. 通信使用明文可能会被窃听

2. 报文内容可能会被篡改

3. 通信方的身份可以被伪装

 

什么是https:

http+加密+认证+完整性保护=https

HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL(SecureSocket Layer)和TLS(TransportLayer Se-curity)协议代替而已。一般http直接和tcp通信,当使用https的时候则是http先和ssl通信,在和tcp进行通信。

 

加密的方式:

1.公开密钥加密技术(这时一种非对称加密方式。具体的比如RSA加密,RSA原理见链接),这种方式有两种密钥,一种是公有的密钥,可以发送给任何人,一种是私有的密钥,只能自己保存。一般信息发送方使用公钥对内容进行加密,然后自己使用私有密钥进行解密。第三方只凭公有密钥无法对已经加密的内容进行解密,只有私有密钥才可以解密。

2.对称秘钥加密技术,即加密和解密使用同一个秘钥。

 

https信息传输一般采用混合加密机制,即在传输实体内容的时候使用的是对称加密,传输对称加密使用的密钥的时候使用的是公开密钥加密技术。这是因为如果使用公开密钥加密技术来加密实体内容会增加更多消耗。


 

https的一般建立过程

1. 客户端发起加密通信的请求,这被叫做client hello请求。在这步中,客户端主要提供的信息有:

    (1) 支持的协议版本,比如TLS 1.0版。

    (2) 一个客户端生成的随机数,稍后用于生成"对话密钥"。

    (3) 支持的加密方法,比如RSA公钥加密。

(4) 支持的压缩方法。

这里需要注意的是,客户端发送的信息之中不包括服务器的域名。也就是说,理论上服务器只能包含一个网站,否则会分不清应该向客户端提供哪一个网站的数字证书。这就是为什么通常一台服务器只能有一张数字证书的原因。对于虚拟主机的用户来说,这当然很不方便。2006年,TLS协议加入了一个ServerName Indication扩展,允许客户端向服务器提供它所请求的域名。

2. 服务器发出响应(server hello),回应主要包含的内容:

(1) 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。

(2) 一个服务器生成的随机数,稍后用于生成"对话密钥"。

(3) 确认使用的加密方法,比如RSA公钥加密。

(4) 服务器证书

除了上面这些信息,如果服务器需要确认客户端的身份,就会再包含一项请求,要求客户端提供"客户端证书"。比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书(认证机构也可以给客户端发布证书)。

3. 客户端收到服务器响应后,首先要验证服务器证书。这里有个知识点比较重要。按照“想当然”的想法,服务器直接把公钥传给客户端就行了,不需要传递数字证书。如果这样的话,有可能会有第三方劫持会话,发送一个假的公钥,实现中间人攻击。所以需要证明这个密钥就是真正的服务器所发送的,这个时候需要第三方的权威认证机构来证明。证明的方法是:首先,服务器的运营人员向数字证书认证机构提出公开密钥的申请。数字证书认证机构在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公钥证书后绑定在一起。而且第三方权威认证机构公布自己的密钥,浏览器一般会把公开密钥植入内部。所以服务器会发送一个证书过来。验证证书的时候,使用第三方权威认证机构的公开密钥进行解密,验证通过那就意味着认证服务器的公开密钥是真实有效的数字证书,而且服务器的公开密钥是值得信赖的。


   验证完服务器的证书之后,如果证书没有问题,客户端就可以从证书中取出公开密钥,然后发送下面的信息:

       (1) 一个随机数。该随机数用服务器公钥加密,防止被窃听。

(2) 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。

(3) 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。

以上过程总共出现了三个随机数,客户端用商定的加密方法对这三个随机数进行处理,生成此次会话要使用的对称密钥(这个时候也可以称它为会话密钥)

 

4. 服务器最后的回应

       服务器这个时候和客户端一样生成对称密钥。然后发送以下消息:

    (1)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。

(2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。

 

到这里客户端和服务器就可以进行https通信了。



参考链接:阮一峰老师对于ssl的讲解