第五篇:HTTPS 与 TLS/SSL 握手原理
前言
HTTPS(HTTP over TLS/SSL)是在 HTTP 之上通过 TLS/SSL 实现加密、认证和完整性保护的安全传输协议。理解 HTTPS 握手过程和底层加密原理,有助于排查性能、安全问题以及正确配置证书。
一、TLS/SSL 协议演进
-
SSL 1.0、2.0、3.0(已淘汰)
-
SSL 1.0 未公开,2.0 存在多重安全缺陷,3.0 在 1996 年发布并成为后续 TLS 的基础。
-
-
TLS 1.0 (1999)
-
基于 SSL 3.0,改进了消息认证和加密算法。
-
-
TLS 1.1 (2006)
-
增加对 CBC 模式的 IV 随机化,抵御重放攻击。
-
-
TLS 1.2 (2008)
-
支持 SHA-256、AEAD (GCM) 模式,允许协商更强加密套件。
-
-
TLS 1.3 (2018)
-
精简握手流程(1-RTT 或 0-RTT)、废弃旧加密套件、内置前向保密 (PFS)。
-
二、公钥基础设施 (PKI) 与证书链验证
-
根证书 (Root CA)
-
由受信任的根证书颁发机构签发并预装在操作系统或浏览器中。
-
-
中间证书 (Intermediate CA)
-
根 CA 签发给中间 CA,用于签发终端证书,减少根密钥暴露风险。
-
-
服务器证书 (Leaf Certificate)
-
用于具体域名的身份验证,包含域名、公钥、有效期等。
-
-
证书链验证
-
客户端通过根证书验证中间证书,再通过中间证书验证服务器证书,完成信任路径。
-
三、TLS 全量握手流程 (Full Handshake)
下文详细描述 HTTPS 握手的各个步骤和对应报文内容,以帮助理解加密协商和认证过程: (Full Handshake)
-
ClientHello
-
包含版本、随机数 (ClientRandom)、支持的加密套件列表、扩展(如 SNI、ALPN)。
-
-
ServerHello
-
服务器选择加密套件、返回版本、随机数 (ServerRandom)、扩展。
-
-
证书 (Certificate)
-
服务器发送自身证书链,客户端验证证书合法性。
-
-
ServerKeyExchange (可选)
-
对于 DHE、ECDHE 等密钥交换算法,服务器发送参数或公钥。
-
-
CertificateRequest (可选)
-
双向 TLS 时,服务器请求客户端证书。
-
-
ServerHelloDone
-
服务器结束握手消息。
-
-
ClientKeyExchange
-
客户端生成 Pre-Master Secret,用服务器公钥加密并发送。
-
-
ChangeCipherSpec / Finished
-
双方切换到加密模式,互换 Finished 报文,验证握手消息完整性。
-
-
加密数据传输
-
后续所有应用数据均在此加密信道内传输。
-
四、会话恢复与 0-RTT
-
会话 ID (Session ID)
-
客户端缓存服务器返回的 Session ID,可用于后续连接复用。
-
-
会话票据 (Session Ticket, RFC 5077)
-
无状态恢复,会话票据由服务器签名,客户端保存,恢复时发送票据。
-
-
0-RTT (TLS 1.3)
-
客户端使用之前会话密钥,在握手前发送加密应用数据,实现零往返延迟启动。
-
需注意重放风险,适用于幂等请求。
-
五、小结与优化建议
-
启用 TLS 1.3:减少时延、提高安全性。
-
使用 ECDHE+AEAD:保证前向保密和高效加密。
-
启用 Session Resume:使用 Session Ticket 和 0-RTT 提升性能。
-
合理配置 SNI 和 ALPN:支持多域名与 HTTP/2+。