HTTPS 与 TLS 握手
适用范围:区分 TLS 1.2 的 RSA 密钥交换与 TLS 1.3。旧版 RSA 流程用于理解历史协议,不代表现代 HTTPS 的通用握手流程。
HTTP 与 HTTPS
HTTPS 在 TLS 保护下使用 HTTP,提供传输机密性、完整性和服务器身份验证;常见网站使用证书认证。HTTP 与 HTTPS URI 的默认端口分别为 80 和 443,都可以显式指定其他端口。
不能直接下结论“HTTP 快、HTTPS 慢”。TLS 初次握手和加密有开销,但连接复用、会话恢复、TLS 版本、网络 RTT 与 HTTP 版本都会影响实际性能,比较时应控制这些条件。HTTPS 也不保证网站业务本身可信或没有漏洞。
来源:RFC 9110 §4.2 (opens new window)。HTTP 版本差异与缓存见 HTTP 基础。
证书与身份验证
证书包含公钥、主体、签发者、有效期及扩展。客户端验证证书链的签名,并检查有效期、用途和目标主机名是否匹配。验证签名不是“用 CA 公钥解密证书”;服务器还需要在握手中证明其持有相应私钥。
证书用于身份验证,应用数据使用握手派生的对称密钥加密。现代 TLS 不直接用证书公钥加密 HTTP 正文。
TLS 握手对照
| 阶段 | TLS 1.2:RSA 密钥交换示例 | TLS 1.3:证书认证与 (EC)DHE 示例 |
|---|---|---|
| 协商 | ClientHello、ServerHello 协商版本和套件 | ClientHello 携带 key_share,ServerHello 选择参数;必要时有 HelloRetryRequest |
| 认证 | 服务器发送证书,客户端验证 | 服务器发送 Certificate、CertificateVerify;客户端验证证书与握手签名 |
| 密钥交换 | 客户端用证书公钥加密 premaster secret,服务器用私钥解密 | 双方根据临时密钥协商共享秘密;证书私钥用于认证,不用于解密 premaster secret |
| 派生密钥 | 从 premaster secret 和双方随机数派生 master secret,再派生流量密钥 | 使用 HKDF 派生握手及应用流量秘密和密钥 |
| 完成握手 | ChangeCipherSpec 切换记录保护状态,Finished 验证握手 | Finished 验证握手;兼容用途的 ChangeCipherSpec 不承担密钥切换职责 |
TLS 1.2 也支持 (EC)DHE,不能把“TLS 1.2”与“RSA 密钥交换”画等号。master secret 是派生密钥的秘密材料,不是直接用于加密 HTTP 的对称密钥。
随机数参与密钥派生和握手绑定,但不能保证修复低质量随机源。密钥材料必须来自安全的随机生成过程。
前向保密与 0-RTT
- 临时 (EC)DHE 能提供前向保密;TLS 1.3 的纯 PSK 模式不具有与 PSK+(EC)DHE 相同的保证。
- TLS 1.3 的 0-RTT 数据可能被重放,且不具备完整前向保密。应用不能仅依靠 TLS 来防止早期数据重放,需要按业务语义处理。
证书命令速查
以下是本地学习用的密钥与 CSR 示例。CA 签发命令需要你已经持有用于实验的 CA 证书和私钥。
| 用途 | 命令 |
|---|---|
| 创建 RSA 私钥 | openssl genrsa -out example.key 2048 |
| 导出公钥 | openssl rsa -in example.key -pubout -out example.pub.pem |
| 创建证书请求 | openssl req -key example.key -new -out example.csr |
| 使用实验 CA 签发 | openssl x509 -req -in example.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out example.crt -days 365 |
| 查看证书 | openssl x509 -in example.crt -noout -text |
以上命令不配置站点所需的全部证书扩展;用于 HTTPS 的证书还需要配置正确的 Subject Alternative Name、用途等条件。部署时按 CA 与服务器的文档配置。
关联与来源