从HTTP到HTTPS:后者如何保证安全性?
1.HTTP的问题
- 通信的过程中使用明文,内容容易被窃听。
- 没有验证通信方的身份,容易遭遇伪装。
- 无法证明报文的完整性,内容容易遭遇篡改。
为了解决这个三个问题,HTTPS应运而生。HTTP+加密+认证+完整性保护=HTTPS。
2.HTTPS
背景知识:
- HTTPS中采用了“公钥+私钥”和“共享密钥”两种方式对通信的内容进行加密。
- 公钥加密的内容只有相应的私钥能解开,反之亦然。
- 共享密钥是两边有相同的钥匙。即两边可以用“一个密码”进行解密。
- 数字证书用来证明一个服务器是确实存在的、是安全的。
- 权威机构CA能对别人的公钥进行认证。
完整的一次通信(服务器到浏览器):
通信前完成的东西:
- 服务器把自己的公钥 S.pub 给权威机构CA,CA用它自己的私钥 C.pri 对 S.pub 进行认证(加密),产生一个数字证书。证书里面有 S.pub 和认证机构、服务器的域名等。数字证书返回给服务器。
- 浏览器内置了CA机构的公钥 C.pub(根证书)。C.pub 能对 C.pri 加密过的东西解密。
开始通信:
- 服务器将数字证书(认证机构、服务器本身的域名等信息)发送给浏览器。
- 浏览器接收到了数字证书,使用 C.pub(根证书)对数字证书进行解密。解密后对比域名和数字证书的颁发机构的合法性。如果合法,则证明了通信方身份的可靠性。且此时拿到了 S.pub。
- 浏览器自己生成一个共享密钥(一串随机数),通过 S.pub 加密,发送给服务器。
- 服务器用自己的私钥 S.pri 对共享密钥进行解析,拿到了共享密钥。
- 服务器、浏览器开始使用共享密钥进行通信。
疑问:
Q: 假设有中间人在步骤2中,把“数字证书+公钥”给劫持了,伪造了一份假的给浏览器,会发生什么?
A:
- 由于中间人没有CA机构的私钥C.pri,所以无法伪造证书。
- 中间人如果用自己创造的私钥伪造了一份发给浏览器,则浏览器无法使用提前内置的C.pub(根证书)对数字证书解密。
- 中间人把自己的公钥也拿去给CA认证(产生一份属于中间人的数字证书),但认证的信息里面包含了中间人的信息。此时浏览器可以用提前内置的C.pub(根证书)对证书解密。但对比域名后发现不是服务器的,所以无法伪造。
Q: 为什么后面要用共享密钥通信?
A: 因为使用共享密钥加密解密效率更高。
PS:
证书通常包含这些内容
(1) 服务端的公钥;
(2) 证书发行者(CA)对证书的数字签名;
(3) 证书所用的签名算法;
(4) 证书发布机构、有效期、所有者的信息等其他信息。