一文看懂HTTPS的核心知识

1、HTTPS历史

  由于HTTP的消息传输的安全隐患,于是网景公司在1994年设计了SSL(Secure Sockets Layer,安全套接字层)协议,目的是保障网上交易安全,从而就诞生了HTTPS。有了SSL之后,HTTP在和TCP通信之前,先和SSL通信,SSL 会对 HTTP 的报文进行加密,再由SSL和TCP通信。最初,HTTPS 是与 SSL 一起使用的,鉴于SSL协议是网景公司专有的,IETF(The Internet Engineering Task Force,国际互联网工程任务组)成立了一个小组负责标准化该协议,后来就有了RFC 2246,即TLS 1.0(Transport Layer Security,传输层安全),现在最新版本已经到了TLS 1.3。TLS 或 SSL 协议不仅可以服务于 HTTP 协议,还可以为电子邮件、即时通讯提供安全服务。

2、TLS协议

  TLS协议的目标是为在它只是运行的应用提供三个基本服务:加密、身份验证和数据完整性。正是这三项基本服务保证了HTTP通信的安全。

2.1、加密(混淆数据的机制)

  先介绍一下TLS用到的两种加密算法,共享密钥加密和公开密钥加密。

  • 共享密钥加密(也叫对称密钥加密):加密和解密都用同一个密钥的加密方式。加密算法处理速度比公开密钥快。
  • 公开密钥加密(也叫非对称密钥加密):这种加密方式有两把密钥,一把私有密钥,一把公开密钥。通过公开密钥加密,然后通过私有密钥解密。公开密钥可以告诉任何人,但私有密钥只有自己才知道。

  它们是怎么进行加密解密的呢?我们先来试试第一种加密方式,客户端通过密钥加密,然后把密钥和加密后的数据一起发给服务器,然后服务器解密。聪明人一眼就可以看出来这种方式行不通,如果能保证密钥能安全到达服务器的话,那数据也能安全到达,所以这种办法行不通。

  第二种方式很好的解决了共享密钥加密的困难。客户端通过服务器的公开密钥加密,然后把加密后的数据发送给服务器,服务器再通过自己的私有密钥解密。私有密钥只有一份,就算窃听者拿到数据,也无法解密。但是这种方式也有缺陷,公开密钥加密的算法太复杂了,需要运行太多的时间。

  最终TLS采用了共享密钥加密和公开密钥加密两者并用的混合加密机制,服务器把自己的公开密钥传送给客户端,客户端接收到公开密钥,然后创建一个共享密钥,用公开密钥给共享密钥加密,然后把加密后的共享密钥发送给服务器,服务器通过私有秘钥进行解密,获得共享密钥,双方都有了同一个共享密钥之后,就通过共享密钥来加密解密报文。

2.2、身份验证(验证身份标识有效性的机制)

  上面介绍的混合加密机制看上去很理想,遗憾的是,依然存在一个问题没解决,那就是无法证明客户端接收到的公开密钥是货真价实的。介绍解决办法之前,先介绍一下CA(Certificate Authority,数字证书认证机构):

数字证书认证机构,也称为电子商务认证中心、电子商务认证授权机构,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。

  申请者通过CA申请数字证书,CA验证申请人的身份,然后发放数字证书。证书中绑定了公钥数据和私钥拥有者的身份信息,并带有CA的数字签名,证书中也包含了CA的名称。

  那么在客户端与服务器通信的时候,服务器将证书发送给客户端,客户端在拿到这个证书之后怎么判断证书的真伪呢?这才是身份验证的关键所在。客户端读取证书中CA的名称,因为浏览器会内置常用CA的公开密钥,然后通过CA的名称查询它的公钥,验证证书上面的数字签名是否正确。此处的公钥并不是客户端与服务器通信加密用的公钥,而是CA公布出来的公钥,用来验证证书的数字签名。验证通过了,就能判断证书的真实性,也就可以相信证书里的公开密钥是可以信任的。

2.3、数据完整性(检测消息是否被篡改或伪造的机制)

  除了混合密钥加密和身份验证,TLS协议还提供了自己的消息分帧机制,使用MAC(Message Authentication Code,消息认证码)签署每一条消息。MAC算法是一个单向加密的过程,密钥由连接双方协商确定(这里用的就是共享密钥)。只要发送TLS消息,就会生成一个MAC值附加到该消息中。接收端通过共享密钥计算和验证这个MAC值来判断消息的完整性和可靠性。

  上述三种机制是TLS协议的核心,它们为Web通信构建了一个安全的环境。了解完这三种机制之后,咱们来看一下它们具体是怎么协作的,也就是TLS握手的过程。

3、TLS握手

  客户端与服务器在通过TLS交换数据之前,必须协商建立加密信道,协商的过程叫做TLS握手,也叫TLS协商。下图的握手过程是在TCP三次握手成功的基础上进行的

   

  1. 客户端发送 Client Hello 报文开始 SSL 通信。报文中包含客户端支持的 SSL 的指定版本、加密组件列表(所使用的加密算法及密钥长度)。
  2. 如果服务器支持 SSL 通信,会以 Server Hello 报文作为应答。和客户端一样,在报文中包含 SSL 以及加密组件。服务器的加密组件内容是从接受到的客户端加密组件内筛选出来的。
  3. 之后服务器发送 Certificate 报文。该报文中包含公开密钥证书。(客户端拿到公开密钥证书之后通过数字签名验证证书的真实性)
  4. 最后服务器发送 Server Hello Done 报文通知客户端,最初阶段的 SSL 握手协商部分结束。
  5. SSL 第一次握手结束之后,客户端以 Client Key Exchange 报文作为回应。报文中包含了接下来会使用到的共享密钥。该报文已用步骤3的公开密钥进行加密。(服务器收到之后通过私有密钥解密,得到共享密钥)
  6. 接着客户端发送 Change Cipher Spec 报文,该报文提示服务器,在此报文之后的通信会采用共享密钥加密。
  7. 客户端发送 Finished 报文。该报文会生成一个消息认证码附加到该消息中。如果服务器能正确解密该报文,并且验证了MAC,那么到目前为止协商过程都是成功的,此时服务器信任了客户端。
  8. 服务器同样发送 Change Cipher Spec 报文,通知客户端,在此报文之后的通信会采用共享密钥加密。
  9. 服务器同样发送 Finished 报文。该报文也会生成一个消息认证码附加到该消息中。如果客户端能正确解密该报文,并且了验证MAC,那么建立加密信道成功,接下来就开始发送应用数据。

4、总结

  HTTPS的核心就是TLS,HTTPS的安全性都是TLS提供的。所以弄明白了TLS协商的过程,你就明白了HTTPS为什么安全。

  

  非常感谢您的阅读,文中如有不对的地方,欢迎指正交流!   

猜你喜欢

转载自www.cnblogs.com/ad-mushroom/p/10447931.html