HTTPS握手过程

HTTPS 即 HTTP over TLS,是一种在加密信道进行 HTTP 内容传输的协议。

TLS 的早期版本叫做 SSL。SSL 的 1.0, 2.0, 3.0 版本均已经被废弃,出于安全问题考虑广大浏览器也不再对老旧的 SSL 版本进行支持了,因此这里我们就统一使用 TLS 名称了。

所以,我们探讨HTTPS的握手过程,其实就是 SSL/TLS的握手过程。
TLS旨在为Internet 提供通信安全的加密协议。TLS握手是启动和使用TLS加密的通信会话的过程。在TLS握手期间,Internet中的通信双方会彼此交换信息,验证密码套件,交换会话密钥。
每当用户通过HTTPS 导航到具体的网站并发送请求时,就会进行TLS握手。除此之外,每当其他任何通信使用HTTPS(包括API调用和在 HTTPS上查询DNS)时,也会发生TLS握手。

TLS通信流程分为HTTP握手阶段和TLS握手阶段

TLS 的基本过程如下:

  • 在进行通信前,首先会进行HTTP的三次握手,握手完成后,再进行TLS的握手过程

  • 客户端发送一个 ClientHello 消息到服务器端,消息中同时包含了它的 Transport Layer Security (TLS) 版本,客户端支持的密码套件以及一串客户端随机数。

  • 服务器端向客户端返回:

    • ServerHello ,消息中包含了服务器端的 TLS 版本,服务器所选择的支持的密码套件,服务端生成的随机数;
    • server_certificates,消息包含了服务器端配置的证书链,用于身份验证与密钥交换。
    • server_hello_done,通知客户端 server_hello 信息发送结束。
  • 客户端根据自己的信任 CA 列表,校验证书的合法性。

    • 合法性验证包括如下:

      (1) 证书链的可信性 trusted certificate path。

      (2) 证书是否吊销 revocation,有两类方式离线 CRL 与在线 OCSP,不同的客户端行为会不同。

      (3) 有效期 expiry date,证书是否在有效时间范围。

      (4) 域名 domain,核查证书域名是否与当前的访问域名匹配,匹配规则后续分析。

    基于公钥证书交换公钥的分配过程
  • 客户端向服务器端发送:

    • client_key_exchange,合法性验证通过之后,客户端计算产生随机数字,并用证书公钥加密,发送给服务器。
    • 客户端根据自己的随机数和服务器端发送来的随机数生成对称密钥。
    • 客户端将之前所有通信参数的 hash 值用公钥加密后发送给服务器端。
    • change_cipher_spec,客户端通知服务器使用私钥解密消息
  • 服务器端向客户端返回:

    • 服务器端使用自己的私钥解密消息得到客户端产生的随机数,然后使用这串随机数生成对称密钥
    • 服务器端计算之前所有接收信息的 hash 值,然后解密客户端发送来的信息,检查这两个值是否对应,验证数据和密钥正确性。
    • change_cipher_spec,验证通过后,服务器端通知客户端使用协商好的对称密钥加密消息。
  • 从现在开始,接下来整个 TLS 会话都使用对称秘钥进行加密,传输应用层(HTTP)内容

从上面的过程可以看到,TLS 的完整过程需要三个算法(协议),密钥交互算法,对称加密算法,和消息认证算法(TLS 的传输会使用 MAC(message authentication code) 进行完整性检查)

相关算法图解:

使用公钥密码建立对称密钥(无第三方)
MAC鉴别原理

参考文章:

(1条消息) TLS/SSL 工作原理及握手过程详解_Tyler_Zx的博客-CSDN博客_tls原理图解

HTTP over SSL/TLS · 笔试面试知识整理 (hit-alibaba.github.io)

(图解HTTP)

posted @ 2022-05-26 15:52  melons  阅读(321)  评论(0编辑  收藏  举报