彻底图解 HTTPS

安全基础

咱们先来看下数据在互联网上数据传递可能会出现的三个比较有表明性的问题,其实后面提到的全部方法,都是围绕解决这三个问题而提出来的。git

窃听

image

伪造

image

否定

image

对称密钥加密

假设 A 正在经过互联网向 B 发送数据,若是不对数据进行加密,数据就可能被恶意的第三者 X 看到github

所以,须要保密的数据须要进行加密再发送安全

image

  • 用将数据进行加密,使其成为密文
  • 把密文发送给 B
  • B 使用密钥解密从 A 收到的密文,这样就能获得原始数据
  • 由于是加密数据,即便它被恶意的第三方截获也是安全的

“对称密钥加密” 一个很重要的特色就是使用相同的密钥进行加密和解密服务器

image

回到刚刚那个场景,假设 B 是没有解密钥匙的,因此 A 须要经过互联网将钥匙发送给 B并发

  • 可是 X 也有可能看到这个钥匙
  • 所以,X 也能够经过这个钥匙来解密密文

上面这个场景就会引出一个新问题,这个问题被称为 “钥匙交付问题”,那怎么解决这个问题?加密

公开密钥加密

为了解决上面的 “钥匙交付问题”,咱们这里引入一个新的方法 —— "公开密钥加密",下图是 “公开密钥加密” 的主要特色3d

image

  • 用于加密的密钥被称为“公钥”,用于解密的密钥被称为“私钥”
  • 跟 “对称密钥加密” 相比,公开密钥加密每每须要更多的时间用于加密和解密

咱们来看看 “公开密钥加密” 的一整个过程代理

image

接收方 B 建立一个公钥和一个私钥,公钥被发送给 Acode

image

  1. A 使用从 B 收到的公钥加密数据,将密文发送给 B
  2. B 使用私钥解密从 A 接收到的密文,获得原始数据

在这个过程当中cdn

  • 密文和公钥也可能被恶意第三方 X 截获
  • 可是私钥是 B 保存的,X 没法获取到,天然没有办法解密密文
  • 这样就很好的解决了 “钥匙交付问题”

公开密钥加密的问题

  1. 加密和解密都须要耗费时间,有一种叫 “混合加密” 的方法能够解决这个问题
  2. 公开密钥的可靠性

混合加密

image

混合密钥加密分为两个步骤

  1. 经过公开密钥加密传递密钥
  2. 经过速度更快的对称密钥加密方法传递数据

中间人攻击

为了更好地理解公开密钥加密的可靠性问题,咱们回到传递公钥的场景

image

A 拿到的实际上是 X 发送给他的伪造公钥,可是 A 没法察觉

image

最后,X 用他本身的密钥加密响应数据,并发送给 A,就这样,虽然 AB 双方能顺利完成通讯,可是恶意的第三方 X 能看到解密后的请求数据和响应数据,而 AB 双方则绝不知情。

这种经过秘密替换公钥窃取数据的方法被称为“中间人攻击”,问题的根源在于 A 没法确认他们收到的公钥是否由 B 方建立。怎么避免中间人攻击呢?咱们放到数字证书那节再探讨,接下来再讲解一点前置知识

消息鉴别码

消息鉴别码在英文中被称为 MACMAC 能够理解为密钥和密文组成的字符串的哈希值

image

消息鉴别码虽然能够解决伪造问题,可是仍然没法避免 否定 问题

数字签名

为了解决这个 否定 问题,咱们接下来看看 “数字签名” 方法

image

数字证书

虽然上面的方法已经能避免 窃听伪造否定 等问题,可是如今仍是没办法避免“中间人攻击”,由于咱们仍是没办法验证公钥的全部者,所以咱们须要 “数字证书” 系统来验证公钥的全部者。

接下来,先看看数字证书申请的过程,咱们将数字证书认证机构(Certificate Authority)咱们称之为 CA

image

如今 B 已经申请到一个数字证书了,那么怎么使用数字证书来检验公钥 PB 是属于 B 呢

image

如今能够验证 PB 是属于 B 的,可是怎么验证 PC 是属于受信任的 CA 的呢

image

事实上,认证机构造成一个树形结构,高级别的权威机构为较低级别的机构建立证书,那就是说,若是要验证的话,就是一级一级向上认证,信任链条的最终是Root CA,他采用自签名,对他的签名是无条件的信任。

HTTPS

彻底理解上面说的东西以后,就可以很容易理解 HTTPS,它采用的就是上面说的 “混合加密” + “数字证书” 两种技术,来保证整个通讯过程的安全可靠。

HTTPS 作的事情其实就是在传输层跟应用层之间加了一层 SSL/TLS,用于对 TCP 传输内容的加密和解密

image

下图咱们再看一下详细的工做流程

image

用 Node 实现一个中间人代理服务器

到此,咱们都知道了 HTTPS、数字证书等相关的知识,能够动手实现一个中间人代理服务了,这里附上一个连接,有兴趣的话能够看下怎么 用 Node 实现一个中间人代理服务器