HTTPS 为什么安全

最近Mozilla 和 Google 两大浏览器巨头相继宣布取消对沃通新签发证书的信任。就想写一篇小文来应个景。

在网络中裸奔

一般常说的在网络中裸奔,就是网络通信都是用明文进行传输。传统的HTTP 就是明文传输,那么别有用心的人一旦可以抓取到你的通信数据,就知道你的通信内容。

对称加解密

就如二战期间的电报,大家为了被窃听,发送方先采用密码本的方式将报文加密传输,当接收者收到加密后的数据,再使用相同的密码本进行解密。这样即使被窃听,如果没有密码本就没法获知通信数据中的具体内容。

这个方法看似很好,但是普通民用就很不方便。因为发送方和接收方都需要有相同的密钥(密码本),在网络世界中,通信双方距离很远,如果需要交换密钥,就需要通过网络传输进行交换密钥。

传输密钥的过程中只能使用明文的方式传输,也就有密钥会被窃取的风险,窃取者就可以用窃取到的密钥对密文进行解密。

非对称加解密

为了解决对称加密的缺陷,非对称加密就应运而生。在非对称加解密算法中,有两个密钥组成一个密钥对,一个是负责加密的公钥,一个是负责解密的私钥。公钥用来加密,而且是公开的,而私钥就要保存好。应对上面对称加密的缺点,假设A 和 B 要进行通信:

  1. A 和 B 都分别生成一组密钥对,A 的密钥对和B的密钥对
  2. A 和 B 交换自己密钥对的公钥,即A 拿着B 的公钥,B拿着A 的公钥
  3. A 发消息给B时,先用B的公钥对消息加密,然后发个B,B用自己的私钥进行解密
  4. 同样B发消息给A时,先用A的公钥对消息加密,然后发给A,A用自己的私钥进行解密

这样一来即使有人窃取的公钥,也没有办法对消息进行解密,因为没有私钥,且私钥不需要出现在网络传输中,就没有机会被窃取。这样比对称加密就更加安全了。

但是非对称有两个缺点,一个是加解密速度慢,一个是无法防范中间人攻击。

非对称加解密+对称加解密

非对称加密好是好,但有一个缺点,就是很慢。其实这个问题很好解决,就是将对称加密的密钥采用非对称的方式机密后传输,这样一来就不担心对称加密的密钥被窃取了。之后所有的内容都采用对称加解密的方式进行处理。以服务器和客户端为例:

  1. 客户端发起请求
  2. 服务器端生成一组密钥对,并将公钥发送给客户端
  3. 客户端生成一个对称加密的密钥,并使用公钥进行加密后发给服务器端
  4. 服务器端使用私钥进行解密后,就拥有了客户端发来的对称加密的密钥
  5. 后续通信使用对称加解密进行处理

中间人攻击

按上文非对称加解密的方法看似很安全,但是无法防范中间人攻击。现在引入一个中间人C进行分析:

  1. 客户端发起请求
  2. 服务器端生成一组密钥对,并将公钥发送给客户端
  3. 中间人C截取了服务器发给客户端的公钥,并将自己的公钥发给了客户端
  4. 客户端生成一个对称加密的密钥,并使用中间人C 的公钥进行加密后发给服务器端
  5. 中间人C截取了客户端发来的数据,并用自己的私钥进行解密,就获取了客户端发送的对称加解密的密钥
  6. 中间人C 再将客户端发送的对称加解密的密钥使用服务器的公钥加密,并发送给服务器端

这样一来客户端和服务器端通信过程中多了一个C,而且客户端和服务器端无法察觉。

数字证书

中间人攻击的根本在于客户端和服务器端都没有办法确认与之通信的身份。为了解决这个问题人们又引入了数字证书进行身份验证。

这时服务器发送公钥时,不仅仅发送公钥,而且连自己的身份信息一起打包后发送给客户端,这样的目的是为了让客户端知道服务端的身份信息。但是这种情况下中间人依然有办法伪造。

这时候就要引入类似现实生活中公证处之类的机构,这里叫证书授权中心(Certificate Authority),简称CA。而文章开头提到的沃通就是这种性质的公司。

服务器需要去CA 去认证并生成数字签名,而客户端保存自己信任的CA证书(类似公钥)。

从这个流程来看,CA处于很关键的地位,CA认证server,且提供client 对应的公钥。文章开头说道的新闻,应该就是Google 和 Mozilla 不再信任沃通这就CA机构了。

完整的HTTPS示例