“为什么HTTPS更安全”是面试中经常被问到的题目,也是Web开发人员必备的知识。
1. 什么是HTTPS
简单的说,https是在http的基础上增加了**加密、认证、完整性验证**等动作,来保证其安全性。
HTTP 加密 认证 完整性保护=HTTPS
HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL(SecureSocket Layer)和TLS(Transport Layer Security)协议代替而已。
——《图解HTTP》
2. 为什么需要HTTPS
HTTPS是为了解决HTTP协议的不足而诞生的, 在介绍HTTPS之前我们先了解下HTTP不足
- 明文通信,通信内容会被窃听
- 不验证通信方,攻击者可以伪装成通信方
- 不验证报文完整性,通信内容可能被篡改。
3. HTTPS原理
3.1 数据加密
HTTPS整个通信流程中使用到了两种加密技术
- 非对称加密(阶段1:密钥协商/连接建立阶段):加密和解密使用同一密钥。
- 对称加密(阶段2:业务数据通信阶段):加密和解密使用不同的密钥(server端拥有私有,client拥有公钥)
阶段1:通信双方使用非对称加密密钥协商数据传输时的加密算法,并加入随机数生成密钥。
阶段2:通信双方使用阶段1协商的加密算法和密钥对数据进行加密。
为什么要使用两种加密方式?
- 能不能都使用对称加密? 如果只使用对称加密,每一个server-client对使用的密钥必须不一样,否则密钥就泄漏了。而server端又没有安全渠道将与一个client特有的密钥传递给client?直接传输可能被窃取,然后攻击者有了秘钥就可以伪装通信方。
- 能不能只使用非对称加密?从安全角度是可以的, 但是非对称加密本身的实现原来就决定他的计算开销要远远大于对称加密。从效率的角度考虑,数据通信阶段使用对称加密更合适。
综合以上两点,在数据通信阶段使用对称加密,在密钥协商阶段使用非对称加密是比较好的方式。
3.2 通信双方的认证
在前面<数据加密>的介绍中,我们提到了整个HTTPS流程使用非对称加密的密钥协商阶段来校验对称密钥。
那么协商阶段,server端是如何把公钥传输给client, 以及client又是如何验证公钥确实是来自目标server?
server的公钥一般是在client(浏览器)发起请求的时候,server端返回给服务器的。(要client在一开始就和世界上所有的server完成对接,然后预先内置公钥是不现实的。如果client要通信的server的数量是机器有限的,那可以在client中直接内置server的公钥)
但是如果只是返回一个公钥,那么client端无法验证公钥是来自于目标server,还是恶意中间人。
如何才能对server端的公钥进行验证呢?HTTPS引入了数字证书(和数字证书认证机构CA)。
client(浏览器)只需要事先内置有限的几家数字认证机构的公钥。 然后server在数字证书认证机构登录自己的公钥,认证机构使用自己的私钥对server的公钥进行数字签名,并颁发数字证书。
数字证书: 服务器的公钥 数字认证机构基于服务器公钥的数字签名
数字签名: 认证机构先对服务器的公钥生成摘要,然后用认证机构自己的私钥对摘要进行加密。
client 向 server发起连接时,server会下发数字证书给client。 client利用内置的认证机构的公钥,对server下发的证书进行验证。验证通过,就可以确定证书中的公钥是目标服务器的。
3.3 报文完整性保证
既不能读取报文内容,也不能伪装成通信任何一方,那就不能篡改报文了。因此报文的完整性也可以得到保障。
4. HTTPS的通信流程
初始阶段:
客户主机安装客户端(如浏览器), 客户端内置了CA机构公钥。
服务端向CA机构上传自己的公钥,获取CA机构认证的数字证书。
连接通信阶段:
- 客户端要发起对服务端的请求。
- 服务端下发CA机构认证过的数字证书给客户端。
- 客户端利用内置的CA机构的公钥,对数字证书进行验证。并从数字证书中获取服务器公钥。
- 客户端使用服务器的公钥与服务器建立加密通信,协商数据通信时的加密算法和对称加密秘钥。
- 客户端和服务器使用协商的算法和密钥进行数据通信。
5. 参考资料
- 《图解HTTP》