# TLS 握手（TLS Handshake）是什么？

> TLS 握手是 TLS 连接开始时的一组消息交换，客户端与服务器在其中协商协议版本和密码套件、验证服务器身份并派生会话密钥。

Source: https://ssl.sh/zh/glossary/tls-handshake/
Last updated: 2026-11-10

TLS 握手是应用数据受保护之前双方交换的一组消息。客户端在 ClientHello 中列出支持的版本、[密码套件](https://ssl.sh/zh/glossary/cipher-suite/)、密钥共享参数以及 [SNI](https://ssl.sh/zh/glossary/sni/)、ALPN 等扩展；服务器选定参数，发送证书链，并用私钥对握手记录签名，证明自己持有证书对应的私钥。随后双方根据[密钥交换](https://ssl.sh/zh/glossary/key-exchange/)结果派生对称密钥，各自发送 Finished 消息，其中包含对整个握手过程的 MAC，任何篡改或强制降级都会被发现。

## 为什么重要
HTTPS 的大部分故障都出在握手阶段：证书过期或域名不匹配、缺少中间证书、双方没有共同的协议版本或套件、客户端没发 SNI 等。握手也是 TLS 主要的延迟来源：TLS 1.2 完整握手需要两个往返，TLS 1.3 只需一个，会话恢复还能进一步减少。跨境访问往返时间长，这部分差异会更明显。

## 例子
TLS 1.3 完整握手流程（花括号表示已加密的消息）：

```text
Client                                   Server
ClientHello (key_share, SNI, ALPN) -->
                                   <--   ServerHello (key_share)
                                         {EncryptedExtensions}
                                         {Certificate}
                                         {CertificateVerify}
                                         {Finished}
{Finished}                         -->
[Application data]                <-->   [Application data]
```

用 OpenSSL 观察一次真实握手，查看协商出的版本、套件和证书链：

```bash
openssl s_client -connect example.com:443 -servername example.com
```

## 常见误区
- **流量是用证书里的公钥加密的。** 现代握手中证书密钥只负责签名，真正的会话密钥来自临时密钥交换。
- **每个请求都要握手一次。** 握手按连接进行，HTTP keep-alive、HTTP/2 多路复用和会话恢复让大多数请求无需重新握手。
- **握手失败一定是证书问题。** 版本或套件不匹配、缺少 SNI、中间设备干扰同样常见。

## 相关术语

- [TLS 1.3](https://ssl.sh/zh/glossary/tls-1-3/): TLS 1.3 是当前最新的传输层安全协议版本（2018 年的 RFC 8446，现行规范为 RFC 9846），完整握手只需一个往返，且只保留 AEAD 加密算法。
- [TLS 1.2](https://ssl.sh/zh/glossary/tls-1-2/): TLS 1.2 是 2008 年由 RFC 5246 定义的 TLS 版本，引入了基于 SHA-256 的密钥派生和 AES-GCM 等 AEAD 加密算法，至今仍被广泛使用。
- [密码套件](https://ssl.sh/zh/glossary/cipher-suite/): 密码套件是 TLS 客户端和服务器协商使用的一组命名的加密算法组合，例如 TLS_AES_128_GCM_SHA256，决定连接用什么算法保护数据。
- [密钥交换](https://ssl.sh/zh/glossary/key-exchange/): 密钥交换是 TLS 握手中客户端与服务器建立共享秘密的步骤，保护连接的对称密钥都由这个共享秘密派生而来。
- [SNI](https://ssl.sh/zh/glossary/sni/): SNI 是 TLS 的一个扩展，客户端在 ClientHello 中写明要访问的域名，使同一个 IP 能为多个 HTTPS 站点分别返回各自的证书。
- [ALPN](https://ssl.sh/zh/glossary/alpn/): ALPN 是一个 TLS 扩展，让客户端和服务器在握手过程中直接商定上层协议，例如 h2 或 http/1.1，不需要额外往返。
- [会话恢复](https://ssl.sh/zh/glossary/session-resumption/): 会话恢复是 TLS 的一种机制，客户端重连时复用先前会话的密钥材料，跳过完整的密钥交换和证书验证。
- [证书链](https://ssl.sh/zh/glossary/certificate-chain/): 证书链是从网站终端证书经中间证书一直到受信任根证书的有序证书序列，每一张都由下一张签名。
