所有 SSL 文章 SSL 与证书

SSL/TLS 如何工作:TLS 握手详解

每次你访问 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 次往返:

  1. Client Hello → 支持的版本、密码套件、随机数
  2. Server Hello → 选定的密码套件、证书、服务器密钥交换
  3. Client Key Exchange → 预主密钥(用服务器公钥加密或通过 Diffie-Hellman)
  4. 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 证书。证书提供:

  1. 服务器的公钥 —— 在密钥交换中使用
  2. 域名 —— 浏览器检查它们是否与 URL 匹配
  3. CA 签名 —— 证明受信任的证书颁发机构为此证书背书
  4. 有效期 —— 浏览器拒绝过期证书

没有有效证书,握手失败,浏览器显示安全警告。获取免费证书 →

性能

TLS 1.2TLS 1.3
完整握手2 次往返1 次往返
恢复会话1 次往返0-RTT(第一条消息即发送数据)
增加的延迟20-80ms10-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 证书

  1. 服务器的公钥 —— 在密钥交换中使用
  2. 域名 —— 浏览器检查它们是否与 URL 匹配
  3. CA 签名 —— 证明受信任的证书颁发机构为此证书背书
  4. 有效期 —— 浏览器拒绝过期证书

没有有效证书,握手失败,浏览器显示安全警告。获取免费证书 →

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 工作原理 →

相关文章

SSL 与证书 2026-05-08
什么是 HTTPS?完整指南
HTTPS 加密浏览器与网站之间的连接。了解 HTTPS 的工作原理、TLS 握手、HTTP 与 HTTPS 的区别、性能影响,以及如何免费启用。
SSL 与证书 2026-05-08
SSL 与 TLS:有什么区别?
SSL 已弃用。TLS 才是真正保护网络的协议。了解从 SSL 2.0 到 TLS 1.3 的完整历史、技术差异、为什么我们仍说'SSL',以及你需要做什么(可能什么都不用)。
SSL 与证书 2026-05-07
ECC 与 RSA 证书:该如何选择?
对比 ECC(ECDSA P-256)和 RSA(2048/4096 位)证书。ECC 密钥更小、更快。了解为什么 GetHTTPS 默认使用 ECC,以及何时 RSA 仍有意义。
在浏览器中获取免费 SSL 证书
无需安装,无需账号。私钥始终留在你的设备上。
获取证书