公钥密码学(也称非对称密码学)是 SSL/TLS 的基础。它使用一对数学相关的密钥——一个公钥、一个私钥——来加密数据、验证身份和建立安全连接。每个 HTTPS 连接都依赖于它。
密钥对概念
| 公钥 | 私钥 | |
|---|---|---|
| 谁拥有 | 所有人(包含在证书中) | 仅服务器所有者 |
| 能加密 | ✅ | ✅ |
| 能解密 | 仅限私钥加密的内容 | 仅限公钥加密的内容 |
| 能否共享? | 是——这正是其目的 | 永远不能 |
核心原理:用公钥加密的数据只能用匹配的私钥解密。反之亦然。两个密钥在数学上相关联,但无法从公钥推导出私钥。
在 SSL/TLS 中的应用
公钥密码学在每个 HTTPS 连接中服务于三个目的:
1. 密钥交换——建立共享密钥
在 TLS 握手过程中,服务器和浏览器需要协商一个用于加密流量的共享会话密钥。它们不能以明文发送这个密钥——可能被截获。
解决方案:Diffie-Hellman 密钥交换(现代 TLS 中具体为 ECDHE)。双方各自贡献随机值,数学原理使它们能计算出相同的共享密钥而无需传输。服务器的私钥对其贡献进行签名,证明服务器身份。
2. 身份认证——证明身份
服务器的 SSL 证书包含其公钥。证书由证书颁发机构签名。在握手过程中,服务器证明它持有匹配的私钥,从而证明服务器确实是证书所声明的身份。
没有这一步,任何人都可以声称自己是 google.com。
3. 数字签名——证明数据完整性
私钥可以创建数字签名——一个数学证明,表明特定数据由密钥持有者签名且未被修改。TLS 握手消息被签名以防止篡改。
对称加密 vs 非对称加密
| 非对称(公钥) | 对称(会话密钥) | |
|---|---|---|
| 密钥 | 两个(公钥 + 私钥) | 一个(共享密钥) |
| 速度 | 慢(约慢 1000 倍) | 快 |
| 用途 | 密钥交换 + 认证 | 加密实际数据 |
| 算法 | RSA、ECDSA、ECDHE | AES-GCM、ChaCha20 |
| 在 TLS 中 | 仅握手阶段 | 握手后(所有流量) |
HTTPS 同时使用两者:非对称加密用于握手(证明身份、交换密钥),然后对称加密用于实际数据传输(因为快得多)。
SSL 背后的算法
RSA
仍在使用的最古老的公钥算法(1977 年)。基于大素数分解的困难性。可用于签名和密钥交换,但不使用 Diffie-Hellman 的 RSA 密钥交换不提供前向保密,已从 TLS 1.3 中移除。
ECDSA(椭圆曲线数字签名算法)
使用椭圆曲线数学的现代签名算法。256 位 ECC 密钥提供等同于 3072 位 RSA 密钥的安全性——更小的密钥、更快的签名。GetHTTPS 默认使用 ECDSA P-256。
ECDHE(临时椭圆曲线 Diffie-Hellman)
现代 TLS 中使用的密钥交换机制。“临时”意味着每个连接都生成新的密钥对——提供前向保密。在 TLS 1.2 和 1.3 中均使用。
AES-GCM
握手后用于加密实际流量的对称加密算法。AES(高级加密标准)配合 GCM(Galois/Counter 模式)同时提供加密和认证。通过 AES-NI 指令在现代 CPU 上硬件加速。
GetHTTPS 如何使用公钥密码学
当你使用 GetHTTPS 时:
- 你的浏览器使用 Web Crypto API 生成一个密钥对——与 TLS 本身使用的相同密码学原语
- 公钥放入发送给 Let’s Encrypt 的 CSR 中
- 私钥留在你的浏览器内存中——从不传输
- Let’s Encrypt 签名公钥并返回你的证书
- 你下载证书(公开)和私钥到你的服务器
私钥仅存在于浏览器内存中,这就是为什么 GetHTTPS 比在远程服务器上生成密钥的工具更具隐私性。
常见问题
量子计算机能破解公钥密码学吗?
当前的量子计算机不能。但足够强大的量子计算机运行 Shor 算法可以破解 RSA 和 ECC。行业正在用后量子密码学做准备——新算法(ML-KEM、ML-DSA)可抵抗量子攻击。TLS 将以混合模式(经典 + 后量子)采用这些算法,不会改变证书的工作方式。
为什么不直接用非对称加密处理所有数据?
速度。非对称操作比对称慢约 1000 倍。用 RSA 加密整个网页是不切实际的。因此,TLS 仅在握手时使用非对称加密(约 1ms),然后切换到对称加密(AES)处理数据——以硬件速度运行。
256 位 ECC 密钥真的足够安全吗?
256 位 ECC 提供约 128 位安全性——意味着攻击者需要大约 2^128 次操作才能破解。这比可观测宇宙中的原子数还多。在可预见的未来(不考虑量子计算机,那需要完全不同的算法)是安全的。
加密和签名有什么区别?
加密: 保护机密性。用接收方的公钥加密 → 只有其私钥能解密。 签名: 证明真实性。用你的私钥签名 → 任何拥有你公钥的人都可以验证它来自你且未被修改。TLS 证书使用签名;TLS 数据传输使用加密。