HTTPS的建立过程

HTTPS简介

HTTP有如下安全性问题:

  • 使用明文进行通信,内容可能会被窃听
  • 不验证通信方的身份,通信方的身份有可能遭遇伪装
  • 无法验证报文的完整性,报文有可能遭篡改。

HTTPS不是新协议,而是让HTTP先和SSL(Secure Socket Layer)通信,再由SSL和TCP通信,也就是说HTTPS使用了隧道进行通信。

通过使用SSL,HTTPS具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)

HTTPS采用混合的加密机制,使用非对称秘钥加密用于传输对称秘钥来保证传输过程的安全性,之后使用对称秘钥加密进行通信来保证通信过程的效率。

数字签名

除了加/解密之外,还可以用加密系统对报文进行签名,以说明是谁编写的报文,同时证明报文未被篡改过。这种技术称为数字签名。

使用数字签名有以下两个好处:

  • 签名可以证明是作者编写了这条报文。只有作者才会有最机密的私有秘钥。因此,只有作者才能计算出这些校验和。校验和就像来自作者的个人”签名“一样。
  • 签名可以防止报文被篡改。如果有恶意攻击者在报文传输过程中对其进行了修改,校验和就不再匹配了。由于校验和只有作者保密的私有秘钥才能产生。所以攻击者无法为篡改了的报文伪造出正确的校验码。

下面的例子说明了A是如何向节点B发送一条报文,并对其进行签名的。

  • 节点A将变长报文用哈希函数提取出定长的摘要
  • 节点A对摘要应用了一个“签名”函数,这个函数以用户的私有秘钥作为参数,因为只有用户才知道私有秘钥,所以正确的签名函数会说明签名者就是其所有者。
  • 一旦计算出签名,节点A就将其附加在报文的末尾,并将报文和签名都发送给B。
  • 在接收端,如果节点B需要确定报文确实是节点A发出的,而且没有被篡改过,节点B就可以对签名进行检查。节点B接收经私有秘钥加密的签名,使用公钥解密,得到拆包后的摘要。由此证明,报文的确是由A发出的。B再对信件使用哈希函数,将得到的结果与节点B解密的摘要版本作对比,如果匹配,说明这封信未修改过。

证书

公钥存在伪装的问题,通过使用数字证书来对公钥进行认证。

数字证书认证机构(CA)是客户端与服务器双方都可信赖的第三方机构。

服务器的运营人员向CA提出公开秘钥的申请,CA在判明申请者的身份之后,会对已申请的公开密钥做数字签名,具体过程如下:CA用自己的私钥对服务器申请的公钥已以及相关信息加密,生成数字证书,然后将这个公开秘钥和数字签名发送给服务器。进行HTTPS通信时就多了一个步骤:

  1. 服务器发送请求时,在签名的同时,附上自己的数字证书;
  2. 客户端收到请求后,用CA的公钥解开数字证书,得到其中服务器的公开秘钥;
  3. 客户端用得到的公钥对数字签名进行验证,如果验证通过了,就可以开始通信了。

HTTPS的通信过程

image-20190831165820155

由上图可知,HTTPS的通信过程主要分为以下几个步骤:

  • 客户端向服务端发送请求;
  • 服务端用将本身的数字证书发送给客户端;
  • 客户端用自己的CA(主流的CA机构证书一般都内置在各个主流浏览器中)公钥去解密证书,如果证书有问题会提示风险
  • 如果证书没问题,客户端会生成一个对称加密的随机秘钥然后再用刚刚解密的服务器端公钥对数据进行加密,然后发送给服务器
  • 服务器收到以后用自己的私钥对客户端发来的对称秘钥进行解密
  • 之后双方就拿着这个对称加密秘钥来进行正常的通信