搞懂 HTTPS 里的一切

76 阅读3分钟

安全连接的建立

在 TLS 握手过程中,客户端和服务器一同执行以下操作:

  1. 指定将要使用的 TLS 版本(TLS 1.0、1.2、1.3 等)
  2. 决定将要使用哪些密码套件
  3. 通过服务器的公钥和 SSL 证书颁发机构的数字签名来验证服务器的身份
  4. 生成会话密钥,以在握手完成后使用对称加密

TLS 握手步骤

  1. 浏览器向服务器发送消息(client hello),消息包含
    • TLS 版本
    • 支持的密码套件
    • 临时值 ra(客户端随机数 client random)
  2. 服务端回复消息(server hello),消息包含
    • 数字证书
    • 服务器选择的密码套件
    • 临时值 rb(服务器随机数 server random)
  3. 服务器发送结束信号
  4. 客户端验证服务器的数字证书(具体见下文数字证书、数字签名部分
  5. 客户端再发送一串随机字节(预设主密钥 premaster secret),预设主密钥是使用数字证书里的公钥进行加密
  6. 服务器收到加密后的预设主密钥(premaster secret)后,用私钥进行解密
    • 这个时候浏览器、服务器都具有 ra+rb+预设主密钥,据此计算出最终的会话密钥,这个密钥不在传输
  7. 浏览器通知服务器双方用新的密钥进行通信
  8. 浏览器发送结束信号
  9. 服务器回复确认更改密钥
  10. 服务器发送结束信号

数字证书(digital certificate)

证书认证机构(Certificate Authority, 简称 CA)将公钥合并到数字证书中,然后服务器会把公钥连同证书一起发送给客户端,私钥则由服务器自己保存以确保安全。

数字证书一般包含以下内容:

  • 公钥
  • 持有者信息
  • 证书认证机构(CA)的信息
  • CA 对这份文件的数字签名及使用的算法
  • 证书有效期
  • ...

数字签名(digital signature)

如何生成

  1. 首先 CA 会把持有者的公钥、用途、颁发者、有效时间等信息打成一个包,然后对这些信息进行 Hash 计算,得到一个 Hash 值
  2. 然后 CA 会使用自己的私钥将该 Hash 值加密,生成证书签名(Certificate Signature),也就是 CA 对证书做了签名
  3. 最后将证书签名(Certificate Signature)添加在文件证书上,形成数字证书

如何验证

  1. 首先客户端会使用同样的 Hash 算法获取该证书的 Hash 值 H1
  2. 通常浏览器和操作系统中集成了 CA 的公钥信息,浏览器收到证书后可以使用 CA 的公钥解密证书签名(Certificate Signature) 内容,得到一个 Hash 值 H2
  3. 最后比较 H1 和 H2,如果值相同,则为可信赖的证书,否则则认为证书不可信

密码规范和密码组合

  1. 握手期间所使用的的密钥交换和认证算法(最常用的是 RSA 算法)
  2. 加密算法(用于握手完成后的对称加密,常用的有 AES、3DES 等)
  3. 信息摘要算法(常用的有 SHA-256、SHA-1 和 MD5 等)

参考

www.cloudflare.com/zh-cn/learn…

blog.csdn.net/BORRISEE6/a…

zhuanlan.zhihu.com/p/43789231

www.youtube.com/watch?v=7DV…