Jacky's blog
首页
  • Android
  • Web
  • Server
  • Python
  • iOS
  • Java
  • Vue
  • 计算机基础
  • AI
  • 全部工具
  • CLI 工具
  • 编辑器
  • 开发工具
  • 构建工具
  • 版本控制
  • 调试工具
  • 网络工具
  • 个人成长
  • 博客
  • 分类
  • 标签
  • 归档
收藏
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • Android
  • Web
  • Server
  • Python
  • iOS
  • Java
  • Vue
  • 计算机基础
  • AI
  • 全部工具
  • CLI 工具
  • 编辑器
  • 开发工具
  • 构建工具
  • 版本控制
  • 调试工具
  • 网络工具
  • 个人成长
  • 博客
  • 分类
  • 标签
  • 归档
收藏
GitHub (opens new window)
  • HTTPS 与 TLS 握手

  • cs
  • network
Jacky
2023-04-28

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 与服务器的文档配置。

关联与来源

  • 网络概念:DNS、SNI、RTT 与 CDN
  • RFC 5246:TLS 1.2 (opens new window)
  • RFC 8446:TLS 1.3,尤其第 2、4、8 节及附录 D (opens new window)
  • RFC 5280:证书与证书链验证 (opens new window)
  • RFC 9325:TLS 安全使用建议 (opens new window)
#network#cs-fundamentals#base
上次更新: 2026/10/18, 22:14:48
最近更新
01
Codex 使用与会话管理指南
10-17
02
Tailscale 入门:让自己的设备跨网络互联
10-15
03
GitHub CLI(gh)工作流与 CI 排查
10-08
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式