轻松理解HTTPS原理

众所周知,http协议是以明文进行传输的,http在明文的传输过程中很容易出现数据被拦截篡改监控的危险,这种情况无益于一人一丝不挂的在街上裸奔,如果被人想看你,你的任何细节都将一目了然。如果你是用的是长城宽带、宽带通、铁通等这类小运营商的话,或许深有体会,就像下图我家长城宽带劫持百度首页,拦截百度的http包然后添加一些html代码在网页底部弹出自家广告,此种做法恶心至极。
长城宽带被劫持

使用HTTP协议的危害

  1. 篡改数据包,致使数据不完整,如上图插入广告
  2. 拦截数据包,对数据进行监控或获取敏感数据,如用户名密码等

鉴于以上原因,HTTP协议现已越来越不被信任,为解决HTTP带来的问题HTTPS协议应运而生。

什么是HTTPS

HTTPS协议 = HTTP协议 + SSL/TLS协议,也就是说HTTPS协议是在HTTP协议基础上加了一层SSL/TLS协议进行数据加解密。也就是说使用HTTPS协议之后在网络上传输的数据是加密的密文,即便进行拦截后没有密钥进行解密的话也就是一串乱码。那HTTPS是如何进行加密的呢?这就涉及到一些简单的密码学基础知识了,不过你只需要简单了解一下秘钥、密文、明文、加密、非对称加密这几个概念即可。

什么是明文、秘钥、公钥、私钥、密文、对称加密、非对称加密、证书?

  1. 明文 - 是指原始干净的数据,比如”I’m a boy.”。

  2. 密钥 - 指示用于加密的参数,密钥又分为两种对称密钥非对称密钥

    1)对称密钥 - 既能用于加密数据也能用于解密数据,对称的意思就是你这头用什么加密,另外一头只能用什么解密,比如你是用对称秘钥是”12345678”进行加密的数据,那么你要解密这些数据你只能用”12345678”进行解密,否则解密失败,换句话说加解密的双方都需要知道这个密钥,双方既能进行加密也能进行解密。

    2)非对称密钥 - 非对称秘钥是一个秘钥组合包含两个密钥,一个是公钥一个是私钥。其中公钥只能用于加密,私钥只能用于解密,因此加解密双方不需要使用同一个密钥,数据加密方只需要公钥进行加密,数据解密方只需要私钥进行解密。

  3. 密文 - 是指通过加密算法加密后的数据,比如明文”I’m a boy.”使用对称秘钥”12345678”进行des算法加密后变成密文”cUHMRj7NhhNXIUSFKyWCCqgaX3SRnhJi”。

  4. 对称加密 - 是指用对称加密密钥以及对应的算法进行加密的方法

  5. 非对称加密 - 是指用非对称加密密钥以及对应的算法进行加密的方法,HTTPS在建立连接以及验证的过程即使用的这种加密方法。

  6. 证书 - 是指数字证书,具有权威性,就像企业公司合同上的印章一样,代表这个是企业授权的合同。

HTTPS通讯步骤

  1. 客户端和服务端建立连接
  2. 服务端将自己的公钥发送给客户端
  3. 客户端校验服务单发过来的公钥是否合法能够信任,如果不信任则抛出异常或者弹出警告
  4. 客户端验证通过,随机生成一个堆成密钥
  5. 客户端将随机生成的堆成密钥使用服务器发送过来的公钥进行加密
  6. 客户端将加密后的公钥密文发送给服务端
  7. 服务端收到客户端发过来的密文
  8. 服务端使用自己是私钥将发过来的密文进行解密,获得对称密钥
  9. 服务端使用对称密钥加密要发送的数据成密文并发送给客户端
  10. 客户端使用对称密钥解密服务端发送过来的密文获得明文
  11. 客户端使用对称密钥加密要发送的数据成密文并发送给服务端
  12. 服务端使用对称密钥解密客户端发送过来的密文获得明文
  13. 重复步骤9-12进行各种通讯

下图为https通讯步骤(图片来自于limboy的博客)
HTTPS通讯步骤

至此,你如果已经理解上述内容,表示你已经差不多掌握https的通讯流程以及为什么https比http安全的原因。但是你如果细心一点会发现上面介绍的概念里面还有一个 证书 没有用到,那么证书到底有什么用呢?你如果仔细推敲上面的HTTPS通讯步骤,你会发现在第2步服务端将自己的公钥发送给客户端时候会产生问题,我们假设客户端和服务器通讯的过程中出现以下场景:

  1. 客户端和服务端建立连接,但是被一个黑客进行了拦截,黑客有自己的公钥和私钥
  2. 客户端和黑客进行了连接并且交换了密钥,黑客和服务端进行了连接并且交换了密钥
  3. 客户端向黑客发送了自己用户名和密码
  4. 黑客解密后获得了用户名密码,然后再向服务端发送用户密码
  5. 服务端校验了用户密码是对的,然后向黑客发送了客户的所有敏感数据
  6. 黑客获得了用户的敏感数据,然后再向客户端发送了所有数据

以上场景中,客户端以为连接的是服务端,服务端以为连接的是客户端,两个人数据发来发去玩的的不亦乐乎,而黑客作为一个中间人已经获得了所有的数据,这就是所谓的 中间人攻击 。那该怎么办?怎么防止这种中间人攻击呢?证书就用来防止这种事情发生的。

我们在HTTPS通讯步骤的第3步中,对公钥进行了校验,这个校验过程就用到了证书。如果校验不通过则会出现异常或者弹出警告,我们著名的12306火车票网站就是因为公钥不被信任导致浏览器弹出警告,如下图:
证书不信任

刚刚上面说到,服务端需要有公钥和私钥来进行加解密,那么这个公钥和私钥是哪里来的呢?当然你可以创建自己的公钥和私钥,这样一来就完了,大家都可以创建,那浏览器该信任谁的公钥?这样也不行。

这个时候我们需要共同推举几个大家都认可且相信的认证机构,这个机构叫证书认证中心,也叫CA(Certificate Authority)
全球知名的CA也就100多个,这些CA都是全球都认可的,比如VeriSign、GlobalSign等,国内知名的CA有WoSign。

那么CA又是怎么对公钥进行认证的呢?

CA自己也有一套公钥和私钥,CA会用自己的私钥对你的公钥进行非对称加密,再加上证书的过期时间、颁发给、颁发者等信息,就组成了数字证书,然后将加密后的公钥发给你,你配置到自己的服务器上。

不论什么平台,设备的操作系统中都会内置100多个全球公认的这些CA的公钥。所以HTTPS通讯步骤现在变成了如下:

HTTPS通讯步骤(重点)

  1. 客户端和服务端建立连接
  2. 服务端将自己的公钥发送给客户端
  3. 客户端尝试用自己系统内置的所有CA的公钥对服务端发过来的公钥进行解密,如果所有CA的公钥都无法解密的话,说明服务端发过来的证书是不被信任的,弹出警告
  4. 客户端尝如果用自己内置的某个CA公钥对服务端发过来的公钥进行解密成功,说明服务端发过来的证书是正常的,然后对服务端的证书进行有效期、机构信息等进行验证,如果验证不通过(如:过期),则弹出警告
  5. 客户端验证通过,随机生成一个堆成密钥
  6. 客户端将随机生成的堆成密钥使用服务器发送过来的公钥进行加密
  7. 客户端将加密后的公钥密文发送给服务端
  8. 服务端收到客户端发过来的密文
  9. 服务端使用自己是私钥将发过来的密文进行解密,获得对称密钥
  10. 服务端使用对称密钥加密要发送的数据成密文并发送给客户端
  11. 客户端使用对称密钥解密服务端发送过来的密文获得明文
  12. 客户端使用对称密钥加密要发送的数据成密文并发送给服务端
  13. 服务端使用对称密钥解密客户端发送过来的密文获得明文
  14. 重复步骤10-13进行各种通讯

经过上述证书验证步骤,则能够避免黑客进行中间人攻击,所以你要做的就是向CA购买一个证书,然后根据自己所使用的技术类型在服务端进行配置好证书即可使用https进行访问。