HTTPs 简介

HTTP 基于明文进行传输,在传输过程中可能遭遇劫持,网络的中间节点可以更改 HTTP 传输内容。在 HTTPs 广泛应用之前,网页被篡改的情况时有发生。有不法分子在别人的网页中插入了广告,以此牟利。更糟糕的是,基于 HTTP 传输的隐私信息会被他人获取。

为了让 HTTP 能够安全地传输 HTTPs 被提出来。HTTPs 并不是什么新的协议,它是在 HTTP 和 TCP 之间加入了一个安全层(Secure Sockets Layer),这个中间层,就负责加解密。通俗地讲,把 HTTP 报文加密后交给传输层,把传输层收到的报文解密后交给应用层。如此,在网络上传输的信息就是加密过的,对方没有办法篡改。

加密方式

在了解 HTTPs 之前,先简要了解一下两种在 HTTPs 中会用到的加密方式。

对称密钥加密

加密和解密采用同一个密钥,过程如图:

至于加解密是具体如何操作,这里就不深究了。只需要了解,对称加密中,加密和解密都采用同一个密钥。

非对称密钥加密

也称为公开密钥加密,这种加密方式有两个密钥——公钥和私钥。其中公钥用于加密,私钥用于解密。公钥和私钥是成对的,而且公钥往往是公开的。通信双方,分别持有公钥和私钥,使用公钥加密后的内容,必须使用私钥才能解密。

HTTPs 中的加密过程

在每个支持 HTTPs 的服务器上都存有一对公钥和私钥。客户端想要建立连接时,服务器会把公钥发送给客户端。客户端生成一个用于对称加密的密钥,使用服务器发来的公钥进行加密,然后发给服务器。这样客户端和服务器都有了客户端上生成的对称加密的密钥的。双方可以使用对称加密算法来实现加密传输了。

可以看到,这里使用非对称加密来保证对称加密的密钥的安全传输。此后的加密都采用对称加密完成。

<w,600px>

上面的图中清晰地展现了这一过程,其中的 session key 就是对称加密的密钥。

数字证书

数字证书的作用

采用上一节中描述的方法,传输内容就不会被他人截获了,就算被抓了包,得到的也是密文。但是假如 DNS 被劫持了,你登录银行的网站 bank.com,在解析域名的时候 DNS 服务的流量被劫持了,你连接到了骗子的服务器上。因为 bank.com 解析的 IP 并不是该银行的服务器的 IP 而是骗子的服务器。此时网址虽然显示的是 bank.com,此时你却连接到骗子的服务器上。之后你输入密码,都传到了骗子哪里。就算传输的内容是加密过的,那也无济于事,因为此时确实是和骗子在通信。

为了保证与之通信的服务器是真实的,数字证书被引入 HTTPs。每个合规的 HTTPs 服务器都需要有一个数字证书,这个数字证书由某个第三方机构颁发,即数字证书认证机构(CA,Certificate Authority)。这是一个客户端和服务器都信赖的第三方机构。

数字证书用于证明服务器的真实性,保障服务器和浏览器之间的通信安全,验证网站的真实身份,区别于钓鱼欺诈网站。

数字证书的生成过程

<text,数字证书签名和验证过程>

要想得到证书,需要去数字证书认证机构(CA)申请,CA 核实了用户身份之后,会给申请者颁发一个数字证书。同时 CA 会在该数字证书上签名,证明这个数字证书真的是自己颁发出去的。

首先 CA 会产生一个公钥和密钥对,这是服务器后期用于非对称加密用的。CA 把其中的公钥作为上图中左侧中的 Data。CA 哪里有另外一个公钥和私钥对,这是是 CA 自己的密钥对。CA 把申请者的公钥做 hash 之后,使用自己的密钥进行加密,此加密内容为签名。然后把用户的公钥和签名拼接起来。

最终申请者得到数字证书里面包含有效日期、对应的域名、CA 的信息等等,另外还包含公钥和公钥的签名。

数字证书的验证方法

在通信的时候,服务器把证书发给客户端,客户端收到以后需要检验此证书的真实性。如果证书是假的,说明对方不值得信赖。因为如果证书是假的,说明服务器的拥有者没有得到 CA 的认可,为什么没有得到认可?因为它是骗子。他没有办法提供有效的身份证明,以说明自己是该域名的拥有者。

<text,数字证书信息>

客户端收到数字证书之后,可以检查该数字证书对应的是不是该网站。如果是,可以进一步检查证书是不是真的。如果是真的,就可以从中取出公钥,基于上一节提到的方法来加密通信了。

问题的关键是如何验证证书的真伪。

请看上上幅图 数字证书签名和验证过程 的右半部分。用户对公钥运行同样的 hash 算法得到左边的 hash 值。然后使用 CA 的公钥对数字证书的签名进行解密,而后比较两个 hash 值是否相同。如果相同,那说明此数字证书的签名确实是 CA 的签名。如果是旁人的签名,那么解密出来的两个 hash 一定不相同。

CA 的公钥从何而来呢?因为全球 CA 的数量时有限的,多数浏览器已经内置了 CA 的公钥。CA 的密钥只有 CA 知道,需要高度保密。