HTTPS
为什么要使用HTTPS
HTTP的明文传输
,需要一个加密方案
安全层的实现过程
对称加密

过程
先协商加解密方式,让服务器和客户端同时决定密钥
- 浏览器发送它所支持的
加密套件列表
和一个随机数 client-random
,这里的加密套件是指加密的方法,加密套件列表就是指浏览器能支持多少种加密方法列表
- 服务器会从加密套件列表中选取一个加密套件,然后还会生成一个随机数 service-random,并将
service-random
和加密套件
返回给浏览器。 - 浏览器和服务器分别返回确认消息
- 把client-random 和 service-random 混合起来生成一个密钥
master secret
,使用master secret和加密套件后进行数据的加密传输。
使用非对称加密
服务器会把公钥发给浏览器,私钥自己留下来。使用公钥加密,只能用私钥解密。

过程
- 浏览器发送支持的
加密套件列表
- 服务器选择一个加密套件,把服务器的
公钥和加密套件
一起发送给浏览器 - 浏览器和服务器返回确认消息
缺点
- 非对称加密的
效率低
- 无法保证
服务器发送给浏览器的数据安全
,服务器数据是用私钥加密的,黑客可以获得公钥
,不能保证服务器数据的安全
对称加密和非对称加密结合
结合以上两种方案,在传输数据阶段依然使用对称加密
,但是对称加密的密钥我们采用非对称加密来传输

过程
- 浏览器向服务器发送
对称加密套件列表、非对称加密套件列表和随机数client-random
- 服务器
保存
随机数client-random,选择
对称加密和非对称加密套件,生成
随机数service-random,向浏览器发送选择的加密套件、service-random和公钥
- 浏览器保存公钥,生成随机数pre-master,然后利用公钥对
pre-master加密
,黑客无法获得。并向服务器发送加密后的数据 - 最后服务器拿出自己的私钥,解密出pre-master数据,返回确认消息
- client-random + service-random+ pre-master 生成 master secret
- 使用master-secret加密传输的数据
缺点
- 防止不了
DNS劫持攻击
,浏览器完全不知道访问的节点是否可以信任
添加数字证书
为了解决以上问题,即证明"我就是我"
,我们引入数字证书
。
服务器通过向CA申请数字证书,证明自己是真正的网站

过程
与上一版本的过程对比,有了两点改变
- 服务器没有直接返回公钥,而是返回数字证书,公钥包含在数字证书中的。
- 在浏览器端多了一步证书验证的操作,验证了证书后,才继续后续的流程
数字证书的验证过程

- 采用 CA 签名时相同的 Hash 函数来计算并得到
信息摘要 A
- 使用CA的公钥解密签名数据,得到
信息摘要 B
- 比较信息摘要A和消息摘要B,相同则说明签名验证成功