HTTPS四次握手

3,632 阅读3分钟

一、四次握手

第1次握手

  • 客户端向服务器发送一个随机数clientKey
  • 客户端发送 SSL协议版本
  • 客户端发送 可选的加密算法
  • 客户端发送 可选的压缩算法

第2次握手

  • 服务端向客户端发送 随机数server key
  • 服务端向客户端发送 选择的压缩算法
  • 服务端向客户端发送 选择的加密算法
  • 服务端发送数字证书(包含公钥)

第3次握手

前置操作: 判断服务端的证书是否合法
  • 客户端发送第三个随机数premaster key
  • 使用3个key来生成会话用的对称密钥。
  • 客户端通知编码变更:接下来会话都会加密。
  • 客户端发送握手结束通知(一条前面所有内容的hash值,供服务端校验)

第4次握手

  • 服务端接收到加密后的premaster key, 用私钥解密,用三个key计算出会话用的对称密钥。
  • 通知编码变更
  • 通知握手结束
  • 发送hash值

小结

SessionKey 作为对称密钥,用于加密通信内容; 非对称加密则用于加密premasterKey。 在某些文章当中,会直接将3个key简述成只有一个。但是原理基本都类似:

  1. 通信双方使用对称密钥加密通信内容。
  2. 对称密钥由客户端产生,并发送给服务端。
  3. 对称密钥发送的过程中,使用服务端发出的公钥加密;服务端接收到加密后的对称密钥,使用私钥解密,得到对称密钥。
  4. 非对称加密只用于握手阶段(即用在 传递客户端产生的对称密钥 过程中)。非对称加密只能保证单向传输的安全性,需要对称加密保证后续双方的双向通信安全。

二、证书与中间人攻击

数字证书如何产生的?

证书以证书链的形式组织。

1. 服务器产生公私钥,递交给证书颁发机构。
2. 服务器将公钥放入证书中,并加入数字签名,颁发给服务器,保证公钥一定来自于服务器。
服务器从此将不再直接将公钥发送给客户端,而是通过将证书发送给客户端

证书所包含的内容

1. 申请方的公钥
2. 数字签名:数字签名相当于防伪标识。
3. 域名
4. 有效期
5. 颁发机构信息
6. 公司信息

证书验证过程

1. 验证域名、有效期是否正确
2. 判断证书来源。每份证书可以根据验证链找到根证书
3. 判断证书是否被篡改
4. 判断证书是否已吊销。通过CRL(Certificate Revocation List 证书注销列表)和 OCSP(Online Certificate Status Protocol 在线证书状态协议)实现
5. 校验数字签名

注意:证书自签名和自验证是否安全? 签名所用的公、私钥内嵌在浏览器(或操作系统环境)中,随浏览器发布。

HTTPS用什么保证安全

1. 会话过程中,采用对称加密。
2. 握手过程中,对会话使用的对称密钥,采用非对称加密。
3. 数字证书保证公钥一定来自服务器。(防止公钥伪造)

HTTPS就完全安全吗?

HTTPS并不能完全避免中间人攻击,中间人攻击的产生有一部分产生于不严格的证书校验。 可以阅读文章https://yaq.qq.com/blog/detail/127.html,学习到证书校验过程中可能出现的疏漏。

中间人攻击(在未使用数字证书或数字证书校验不严格时)

  • 关键在于公钥。
客户端使用了中间人的公钥,把对称密钥加密并发给了中间人。中间人就能在接下来的数据发送中,解密客户端发出的消息了。

参考文章:
mp.weixin.qq.com/s/1x2N8ionE…
wetest.qq.com/lab/view/11…
zhuanlan.zhihu.com/p/140476951