HTTPS的工作原理

来源:互联网 发布:c语言是否窗口 编辑:程序博客网 时间:2024/06/04 18:51

    • 1 什么是HTTPS
    • 2 HTTPS的作用
    • 3 HTTPS加密的过程
    • 4 HTTPS验证流程
      • 1 验证流程
      • 2 客户端如何验证证书的合法性

1、 什么是HTTPS

HTTP就是我们平时浏览网页时候使用的一种协议。HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。SSL目前的版本是3.0,之后IETF对SSL 3.0进行了升级,于是出现了TLS(Transport Layer Security) 1.0。实际上我们现在的HTTPS都是用的TLS协议,但是由于SSL出现的时间比较早,并且依旧被现在浏览器所支持,因此SSL依然是HTTPS的代名词。

2、 HTTPS的作用

网络安全的威胁主要有窃听、篡改和伪造抵赖。
HTTPS的主要作用是两种:
1. 建立一个信息安全通道,来保证数据传输的安全
2. 确认网站的真实性

SSL协议提供的服务主要有:
1. 认证用户和服务器,确保数据发送到正确的客户机和服务器;
2. 加密数据以防止数据中途被窃取;
3. 维护数据的完整性,确保数据在传输过程中不被篡改。

3、 HTTPS加密的过程

首先服务器端用非对称加密(RSA)产生公钥和私钥。然后把公钥发给客 户端,路径或许有人会截取,但是没有用,因为用公钥加密的文件只有私钥可以解密,而私钥永远都不会离开服务器的。当公钥到达客户端之后,客户端会用对称加密产生一个秘钥并且用公钥来加密发送给服务器端,这个秘钥就是以后用来通信的钥匙。这样服务器端收到公钥加密的秘钥时就可以用私钥来解公钥从而获得秘钥。这样的话客户端和服务器端都获得了秘钥,信息交流相对是安全的。流程图如下:
https 加密过程

听起来确实是挺安全的,但实际上,还有一种更恶劣的攻击是这种方法无 法防范的,这就是传说中的“中间人攻击”。在身份认证的过程中,出现了一个“中间人”拦截我们的信息,他有意想要知道你们的消息。我们将这个中间人称为M。当服务器第一次给客户端发送公钥的时候,途径M。M知道你要进行密钥交换了,它把公钥扣了下来,假装自己是客户端,伪造了一个伪秘钥(对称加密产生的),然后用服务器发来的公钥加密了伪秘钥发还给服务器,这样服务器以为和客户端完成了密钥交换,实际上服务器是和M完成了密钥交换(获得了伪秘钥)。同时M假扮成服务器自行用非对称加密产生伪公钥和伪私钥,与客户端进行秘钥交换,拿到客户端发送过来的秘钥。现在客户端拿着秘钥,M拿着秘钥和为伪秘钥,服务器拿着伪秘钥,整个交流的过程就是:

简单点说就是:
1)客户端用秘钥加密信息发送给M;
2)M收到后用秘钥解密拿到信息,然后用伪秘钥加密信息发送给服务器;
3)服务器收到后用伪秘钥解密拿到信息。

这样中间人M就拿到了客户端和服务器所有的交流信息。

对于这种攻击,我们可以加上身份认证:这个时候就要引入CA证书。数字证书中包括的主要内容有:证书拥有者的个人信息、证书拥有者的公钥、公钥的有效期、颁发数字证书的CA、CA的数字签名等。所以网上双方经过相互验证数字证书后,不用再担心对方身份的真伪,可以放心地与对方进行交流或授予相应的资源访问权限。

通俗一点理解就是,服务器端把公钥交给CA证书,CA证书再包装一层。然后再发给客户端,这个包装一层的意思是:保证这个证书是我(服务器)给你(客户端的),其他人拿到了也没有用。

最后,你可能会想既然非对称加密可以那么安全,为什么我们不直接用它来加密信息,而是用来加密对称加密的密钥呢?

这是因为非对称加密的密码对生成和加密的消耗时间比较长,为了节省双方的计算时间,通常只用它来交换密钥,而非直接用来传输数据(具体的可看上文非对称加密的缺点)。

4、 HTTPS验证流程

Https在真正请求数据前,先会与服务有几次握手验证,以证明相互的身份,以下图为例

4.1 验证流程

  1. 客户端,发起一个https的请求,把自身支持的一系列Cipher Suite(密钥算法套件,简称Cipher)发送给服务端
  2. 服务端,接收到客户端所有的Cipher后与自身支持的对比,如果不支持则连接断开,反之则会从中选出一种加密算法和HASH算法
  3. 以证书的形式返回给客户端,证书中还包含了公钥、颁证机构、网址、失效日期等等。
  4. 客户端收到服务端响应后会做以下几件事
    1. 验证证书的合法性
      颁发证书的机构CA是否合法与是否过期,证书中包含的网站地址是否与正在访问的地址一致,发行者证书中的公钥能否解开证书的签名等
      证书验证通过后,在浏览器的地址栏会加上一把小锁(每家浏览器验证通过后的提示不一样 不做讨论),验证不通过会发出提示
    2. 生成随机密码
      如果证书验证通过,或者用户接受了不授信的证书,此时浏览器会生成一串随机数,然后用证书中的公钥加密。       
    3. HASH握手信息
      用最开始约定好的HASH方式,把握手消息取HASH值, 然后用随机数加密 “握手消息+握手消息HASH值(签名)” 并一起发送给服务端
      在这里之所以要取握手消息的HASH值,主要是把握手消息做一个签名,用于验证握手消息在传输过程中没有被篡改过。
  5. 将随机数的签名发送给服务端
  6. 服务端拿到客户端传来的密文,用自己的私钥来解密握手消息取出随机数密码,再用随机数密码 解密 握手消息与HASH值,并与传过来的HASH值做对比确认是否一致。
  7. 然后用随机密码加密一段握手消息(握手消息+握手消息的HASH值 )给客户端
  8. 客户端用随机数解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密
    因为这串密钥只有客户端和服务端知道,所以即使中间请求被拦截也是没法解密数据的,以此保证了通信的安全

非对称加密算法:RSA,DSA/DSS 在客户端与服务端相互验证的过程中用的是对称加密
对称加密算法:AES,RC4,3DES 客户端与服务端相互验证通过后,以随机数作为密钥时,就是对称加密
HASH算法:MD5,SHA1,SHA256 在确认握手消息没有被篡改时

4.2 客户端如何验证证书的合法性?

  1. 验证证书是否在有效期内。
      在服务端面返回的证书中会包含证书的有效期,可以通过失效日期来验证 证书是否过期

  2. 验证证书是否被吊销了。
      被吊销后的证书是无效的。验证吊销有CRL(证书吊销列表)和OCSP(在线证书检查)两种方法。

  3. 验证证书是否是上级CA签发的。

windows中保留了所有受信任的根证书,浏览器可以查看信任的根证书,自然可以验证web服务器的证书,
是不是由这些受信任根证书颁发的或者受信任根证书的二级证书机构颁发的(根证书机构可能会受权给底下的中级证书机构,然后由中级证书机构颁发中级证书)
在验证证书的时候,浏览器会调用系统的证书管理器接口对证书路径中的所有证书一级一级的进行验证,只有路径中所有的证书都是受信的,整个验证的结果才是受信的。

整理转载自:
http://blog.csdn.net/handjc/article/details/50202487
http://www.cnblogs.com/zery/p/5164795.html

0 0
原创粉丝点击