第2章 加密基础:对称与非对称加密、TLS/SSL 原理、证书链

说实话,很多做 gRPC 的朋友一提到「加密」就觉得是安全团队的事。我之前也这么想,直到有一次线上服务因为 TLS 握手太慢,导致 P99 延迟直接翻了三倍。那才意识到——不懂加密原理,性能优化根本无从下手。

这一章,咱们就聊聊那些绕不开的基础知识。我尽量用大白话讲清楚,同时给出性能视角的分析。

2.1 对称加密 vs 非对称加密

这两种加密方式,是所有安全体系的基石。说白了一个是「一把钥匙开一把锁」,另一个是「两把钥匙配一对锁」。

对称加密

客户端和服务端用同一个密钥。加密快,但密钥怎么安全地传给对方?这是个死循环问题。

  • 常见算法:AES、ChaCha20、3DES
  • 优势:性能极高,硬件加速支持好
  • 劣势:密钥分发困难,通信双方必须事先共享密钥

我在项目中做过压测,AES-256-GCM 在现代 CPU 上可以达到 3-5 Gbps 的加解密速度。相比之下,非对称加密慢了至少两个数量级。

非对称加密

公钥加密,私钥解密。解决了密钥分发问题,但性能代价很大。

  • 常见算法:RSA、ECDSA、Ed25519
  • 优势:无需共享密钥,安全性强
  • 劣势:计算开销高,不适合加密大量数据

你想想看,每次非对称加密都要做大数模幂运算,CPU 压力非常大。所以实际中我们只用它来做密钥交换和数字签名,真正的数据传输还是交给对称加密。

维度对称加密非对称加密
密钥数量1 个2 个(公钥+私钥)
加解密速度快(硬件加速)慢(100-1000x)
安全性基础密钥保密数学难题(大数分解/椭圆曲线)
典型场景数据加密传输密钥交换、数字签名
gRPC 应用TLS 记录层加密TLS 握手、证书验证

2.2 TLS/SSL 原理

TLS(传输层安全协议)实际上把对称和非对称加密组合起来了。它的核心思路很巧妙:先用非对称加密安全地协商出一个对称密钥,然后用这个对称密钥加密后续所有通信。

TLS 1.3 握手(我强烈推荐)

相比 TLS 1.2,1.3 版本把握手从 2-RTT 降到了 1-RTT,甚至支持 0-RTT(但要注意重放攻击)。我建议所有新项目直接上 TLS 1.3,性能提升非常明显。

// 简化版 TLS 1.3 握手流程
1. ClientHello —— 客户端发送支持的密码套件和随机数
2. ServerHello —— 服务端选择密码套件,发送证书和公钥
3. 密钥协商 —— 双方用 ECDHE 计算共享密钥
4. Finished  —— 加密的握手完成消息

为什么这么快?因为 TLS 1.3 只保留了 3 个密钥交换算法(均基于 ECDHE),去掉了所有不安全或过时的选项。我在优化公司网关时,从 1.2 迁到 1.3,握手时间从 150ms 降到了 40ms 左右。

性能关键点:TLS 握手的主要开销来自非对称运算(签名验证、密钥交换)。使用 ECDSA 证书和 X25519 密钥交换,可以把计算量降到 RSA 2048 的 1/5 以下。

2.3 证书链与 CA

证书就是公钥的「身份证」。CA(证书颁发机构)负责给它签名,证明这个公钥确实属于某个域名或组织。

完整的证书链通常是这个样子:

根 CA(自签名) —— 中间 CA —— 服务器证书(叶子证书)

我最开始理解的时候有个误区:以为每个证书都要单独验证。其实验证过程是从下往上走:

  1. 用中间 CA 的公钥验证服务器证书的签名
  2. 用根 CA 的公钥验证中间 CA 证书的签名
  3. 如果根 CA 在系统信任列表里,就通过

这里有个性能陷阱。证书链越长,验证耗时越多。我记得有一个客户在证书链里塞了 5 个中间 CA,导致每次握手慢 200ms。优化方案很简单——只保留必要的中间 CA,通常 1-2 级就够了。

避坑指南:我以前调试过一个问题,客户端 CA 证书列表太长(超过 20KB),导致 TLS 握手包分片,反而增加了 30% 的延迟。把不需要的中间 CA 删掉,问题就解决了。

2.4 常见加密算法性能特点

我在做性能基准测试时,整理了一份对比数据。你可以直接拿去参考。

算法密钥长度签名/验证速度硬件加速推荐场景
AES-256-GCM256 bit极快AES-NI对称加密(数据面)
ChaCha20-Poly1305256 bit快软件优化移动端/弱 CPU
ECDSA P-256256 bit中等部分支持证书签名
Ed25519256 bit快良好现代证书/SSH
RSA-20482048 bit慢广泛支持遗留系统(不推荐)
X25519256 bit极快恒定时间密钥交换(TLS 1.3)

我的选择标准是这样:

  • 对称加密选 AES-256-GCM(有 AES-NI 时)/ ChaCha20(移动端)
  • 证书用 ECDSA P-256 或 Ed25519,RSA 尽量不要用了
  • 密钥交换用 X25519,这个是目前性能最好的

小提示:如果你在用 OpenSSL 1.1.1+,可以用 openssl speed -elapsed 命令测试本机算法的实际性能。这个命令我每次换服务器都会跑一遍,心里有数。

gRPC 加密基础与性能优化知识体系 加密性能优化 对称加密 非对称加密 TLS 握手 证书链管理 AES-256-GCM ChaCha20 ECDSA / Ed25519 TLS 1.3 (1-RTT) CA 链裁剪 硬件加速(AES-NI) 算法强度 vs 速度平衡 会话复用(0-RTT) 性能优化建议 最佳实践 • 选 X25519 做密钥交换 • 用 ECDSA 而非 RSA • 开启 OCSP Stapling • 启用 TLS 1.3 禁用 1.2 • 缩短证书链 < 2 级 • 使用 Session Ticket 核心思路:非对称只用于握手,数据传输全部走对称加密

嗯,这张图把整个知识结构串起来了。你从上往下看,先理解两类加密,再看 TLS 和证书,最后落到性能指标和建议上。后面的章节,咱们会反复用到这里的知识点。