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) 进行完整性检查)
相关算法图解:
参考文章:
(1条消息) TLS/SSL 工作原理及握手过程详解_Tyler_Zx的博客-CSDN博客_tls原理图解