每次你访问 HTTPS 网站时,浏览器和服务器都会执行一次 TLS 握手——一次快速交换,用于验证服务器身份、协商加密参数,并派生共享密钥。这在任何页面内容加载之前,通过 1-2 次网络往返(50-200ms)完成。
TLS 1.3 握手(当前标准)
TLS 1.3 在单次往返(1-RTT)中完成握手:
步骤 1 —— Client Hello 浏览器发送:支持的 TLS 版本、支持的密码套件、随机数和密钥共享参数(用于 Diffie-Hellman 密钥交换)。
步骤 2 —— Server Hello + Certificate + Finished 服务器响应:选定的密码套件、其证书(证明身份)、密钥共享,以及 “Finished” 消息。在 TLS 1.3 中,证书是加密的——被动观察者无法看到你连接的是哪个站点。
步骤 3 —— Client Finished 浏览器根据其可信 CA 列表验证证书,从 Diffie-Hellman 交换中计算共享会话密钥,并发送 “Finished” 消息。加密的应用数据现在可以传输了。
总计:1 次往返。 恢复的连接(客户端之前连接过)可以使用 0-RTT——在第一条消息中就发送加密数据。
TLS 1.2 握手(仍被广泛使用)
TLS 1.2 需要 2 次往返:
- Client Hello → 支持的版本、密码套件、随机数
- Server Hello → 选定的密码套件、证书、服务器密钥交换
- Client Key Exchange → 预主密钥(用服务器公钥加密或通过 Diffie-Hellman)
- Change Cipher Spec + Finished(双方)
TLS 1.2 支持更多密码套件——包括一些弱的。正确配置比 TLS 1.3 更重要。
加密连接内部发生了什么
握手完成后,所有数据使用协商的会话密钥进行加密,采用对称加密算法(通常是 AES-256-GCM 或 ChaCha20-Poly1305):
- 机密性 —— 数据被加密;只有两端能读取
- 完整性 —— 每条消息包含 MAC(消息认证码);任何篡改都会被检测到
- 认证 —— 服务器的证书证明其身份(可选地,客户端也是)
每个 HTTP 请求和响应——头部、正文、Cookie、URL——都通过这条加密通道传输。
前向保密
现代 TLS 使用临时 Diffie-Hellman 密钥交换,意味着每个连接生成唯一的会话密钥。即使服务器的私钥后来被泄露,过去的对话也无法被解密。
TLS 1.3 使前向保密成为强制性的。TLS 1.2 支持它但也允许 RSA 密钥交换(不提供前向保密)。这就是为什么推荐 TLS 1.3。
证书的作用
TLS 握手依赖于服务器拥有有效的 SSL/TLS 证书。证书提供:
- 服务器的公钥 —— 在密钥交换中使用
- 域名 —— 浏览器检查它们是否与 URL 匹配
- CA 签名 —— 证明受信任的证书颁发机构为此证书背书
- 有效期 —— 浏览器拒绝过期证书
没有有效证书,握手失败,浏览器显示安全警告。获取免费证书 →
性能
| TLS 1.2 | TLS 1.3 | |
|---|---|---|
| 完整握手 | 2 次往返 | 1 次往返 |
| 恢复会话 | 1 次往返 | 0-RTT(第一条消息即发送数据) |
| 增加的延迟 | 20-80ms | 10-40ms |
| 密码套件协商 | 复杂(37 个密码套件) | 简单(5 个密码套件) |
在现代硬件上,加密的 CPU 开销可以忽略——AES-NI 指令在硬件中处理。主要成本是额外的往返,TLS 1.3 将其最小化。
在网络上能看到什么
不使用 HTTPS(HTTP)
网络观察者可以看到一切:
GET /login HTTP/1.1
Host: example.com
Cookie: session=abc123
username=admin&password=secret123
用户名、密码、Cookie、页面内容——全部明文。
使用 HTTPS(TLS)
同一个观察者看到:
[TLS handshake — server certificate visible in TLS 1.2, encrypted in TLS 1.3]
[Encrypted application data — indistinguishable from random bytes]
[Encrypted application data]
[Encrypted application data]
他们可以看到目标 IP 地址和 SNI 主机名(在 TLS 1.2 中——TLS 1.3 中使用 ECH 加密)。他们无法看到 URL 路径、头部、正文或 Cookie。
证书如何参与
TLS 握手依赖于服务器拥有有效的 SSL/TLS 证书:
- 服务器的公钥 —— 在密钥交换中使用
- 域名 —— 浏览器检查它们是否与 URL 匹配
- CA 签名 —— 证明受信任的证书颁发机构为此证书背书
- 有效期 —— 浏览器拒绝过期证书
没有有效证书,握手失败,浏览器显示安全警告。获取免费证书 →
2026 年常见的 TLS 密码套件
TLS 1.3(仅 5 个密码套件——全部安全)
TLS_AES_256_GCM_SHA384 ← Most common
TLS_AES_128_GCM_SHA256 ← Widely used
TLS_CHACHA20_POLY1305_SHA256 ← Best for mobile/ARM
TLS_AES_128_CCM_SHA256 ← IoT/embedded
TLS_AES_128_CCM_8_SHA256 ← IoT/embedded (short tag)
TLS 1.2(仅使用 AEAD 套件)
ECDHE-ECDSA-AES256-GCM-SHA384 ← Best with ECC cert
ECDHE-RSA-AES256-GCM-SHA384 ← Best with RSA cert
ECDHE-ECDSA-CHACHA20-POLY1305 ← Mobile-optimized
避免 TLS 1.2 中的非 AEAD 套件(CBC 模式)——它们已被 BEAST 和 Lucky13 等攻击证明存在漏洞。
常见问题
HTTPS 会拖慢我的网站吗?
TLS 握手在首次连接时增加一次往返(TLS 1.3)或两次(TLS 1.2)。会话恢复为回访者消除了这一延迟。由于 HTTPS 启用了 HTTP/2(多路复用、头部压缩),HTTPS 站点总体上通常更快。
什么是密码套件?
密码套件是用于密钥交换、加密和消息认证的算法组合。例如:TLS_AES_256_GCM_SHA384 表示使用 AES-256-GCM 加密和 SHA-384 进行消息完整性校验的 TLS。TLS 1.3 只有 5 个密码套件——全部安全。TLS 1.2 有 37 个,其中一些是弱的。
以后有人能解密 HTTPS 流量吗?
使用前向保密(临时密钥交换)时不能。每个会话使用从 Diffie-Hellman 交换派生的唯一密钥。即使服务器的长期私钥被泄露,过去的会话密钥也无法恢复。TLS 1.3 强制执行此机制;TLS 1.2 正确配置时也支持。
GetHTTPS 与此有什么关系?
GetHTTPS 生成使 TLS 握手成为可能的证书。证书包含服务器在密钥交换时使用的公钥。GetHTTPS 使用 Web Crypto API 在你的浏览器中创建这个密钥对,并直接连接到 Let’s Encrypt 的 ACME API 进行签名。GetHTTPS 工作原理 →