HTTPS 并不等于”RSA 加密”。TLS 握手的核心任务是协商出一把对称会话密钥,而 RSA 与 ECDHE 是两条截然不同的协商路径:前者把密钥材料加密后”寄”给服务器,后者让双方各自在本地”算”出同一份秘密。这个差别决定了前向安全性的有无,也解释了 TLS 1.3 为什么把静态 RSA 密钥交换彻底移除。

它解决什么问题

TLS 握手要同时回答两个问题。一是密钥怎么来:握手结束后业务数据用 AES-GCM 这类对称算法保护,双方必须先安全地得到同一把会话密钥。二是身份怎么证:客户端要确认对端真的是目标服务器,而不是中间人塞过来的假公钥——这靠证书与 CA 信任链解决。

RSA 与 ECDHE 在身份认证上做法一致(都用证书签名),分歧集中在第一个问题上:会话密钥的材料,到底是”一方生成、加密传输”,还是”双方协商、各自计算”。

核心原理

RSA 握手:客户端生成,加密传输

TLS 1.2 的静态 RSA 握手流程:

Client                                        Server
| ---------- ClientHello ----------------> | 版本、套件列表、Client Random
| <--------- ServerHello + Certificate --- | 选定套件、Server Random、证书链
| ---------- ClientKeyExchange ----------> | 用服务器 RSA 公钥加密的 PreMasterSecret
| ========== 双方派生会话密钥 ============= | 之后全走对称加密

分四步:

  1. 客户端发送支持的 TLS 版本、密码套件列表和随机数 Client Random。
  2. 服务器回选定套件、随机数 Server Random 和证书链,客户端验证证书。
  3. 客户端生成 48 字节的预主密钥(PreMasterSecret),用证书中的 RSA 公钥加密后发出。
  4. 服务器用 RSA 私钥解密得到同一份预主密钥,双方结合两个随机数派生出会话密钥。

整个方案的安全押在一把长期不变的服务器私钥上——这正是问题的根源。

ECDHE 握手:交换公钥,各自计算

ECDHE(Ephemeral Elliptic Curve Diffie-Hellman,临时椭圆曲线 DH)的思路是:共享秘密从不上网传输。双方各生成一对临时密钥,只交换临时公钥,然后用”自己的临时私钥 + 对方的临时公钥”在本地算出同一份共享秘密。攻击者即便全程抓包,看到的也只有两个公钥,无法推出秘密。

Client                                        Server
| ---------- ClientHello ----------------> | 版本、套件列表、Client Random
| <--------- ServerHello + Certificate --- | 选定套件、Server Random、证书链
| <--------- ServerKeyExchange ----------- | 临时 ECDHE 公钥(用证书私钥签名)
| ---------- ClientKeyExchange ----------> | 客户端临时 ECDHE 公钥
| ========== 各自算出同一共享秘密 ========= | 派生会话密钥

注意 ECDHE_RSA 套件里 RSA 的角色:服务器用证书私钥对临时 ECDHE 参数签名,客户端用证书公钥验签,防止中间人替换临时公钥。RSA 在这里只做身份认证,不碰密钥材料——证书私钥是”签字笔”,不再是”保险柜钥匙”。

深入机制

前向安全性的本质差异

前向安全性(Forward Secrecy)回答的是:长期私钥未来泄露了,历史流量还安全吗?

  • RSA 交换:攻击者当年完整保存握手流量(含加密的 PreMasterSecret),若干年后拿到服务器私钥,就能解开预主密钥、重放派生过程,把历史会话全部解密。长期私钥成了一把能打开过去所有会话的总钥匙。
  • ECDHE 交换:每次握手的秘密由当次的临时私钥参与计算,用完即弃。长期私钥只签过名,从未参与秘密计算,泄露后也无法仅靠它还原历史会话。攻击者必须逐次破解每次握手的临时私钥,代价天差地别。

这就是 ECDHE 的 E(临时)的价值所在。当然,前向安全有前提:临时私钥的质量要高、用完要真正销毁;会话票据密钥若长期不轮换,也会把保护窗口拉长。

静态 RSA 的历史包袱

RSA 交换的 PreMasterSecret 按 PKCS#1 v1.5 填充后加密,这个填充格式引出过 Bleichenbacher 填充预言机攻击:攻击者反复构造密文观察服务器对填充错误的细微行为差异(错误码、耗时),逐步逼近明文。2017 年的 ROBOT 攻击证明大量实现仍有此类侧信道。静态 RSA 被淘汰,一半因为没有前向安全,另一半因为它把太多安全押在了实现细节上。

性能与兼容性权衡

ECDHE 握手要做临时密钥协商加一次签名运算,CPU 开销高于纯 RSA 解密路径;但 ECDHE 可用更短密钥达到同等安全强度,配合会话复用后差距可控。兼容性上,老旧客户端可能只支持静态 RSA 套件——服务端若不再需要兼容它们,应关闭 TLS_RSA_* 套件,只保留带前向安全的选项,并实际核查协商结果而非仅看配置。

对比与权衡

维度 RSA 密钥交换 ECDHE 密钥交换
密钥材料来源 客户端生成,RSA 公钥加密后传输 双方交换临时公钥,各自计算
长期私钥角色 直接解密预主密钥 仅对临时参数签名做认证
前向安全性 无:私钥泄露可回溯解密历史流量 有:仅靠长期私钥无法还原历史会话
历史攻击面 PKCS#1 v1.5 填充预言机(Bleichenbacher/ROBOT) 实现层面需防无效曲线攻击、临时私钥复用过久
握手开销 较低 多一次临时协商与签名,可用会话复用摊薄
TLS 1.3 已移除 成为唯一的密钥交换主线

工程实践

  • 关闭静态 RSA 套件:确认服务端实际协商出的套件,不能只凭”配置了 ECDHE”就放心;openssl s_client 可直接观察。
  • 选对曲线与证书:优先 X25519、secp256r1 等主流曲线;RSA 证书用于签名没有问题,被淘汰的是 RSA 密钥交换而非 RSA 算法本身。
  • 轮换会话票据密钥:会话复用依赖的票据加密密钥要定期轮换,否则前向安全的保护窗口被悄悄拉长。
  • 压测别引用别人的数字:握手成本取决于 RSA 位数、曲线、TLS 库、CPU 指令集与会话复用命中率,用 openssl speed 看单项数量级,再在自己的机器上测完整握手与端到端耗时。

面试视角

RSA 与 ECDHE 握手差在哪?

密钥材料的产生方式不同。RSA:客户端生成 PreMasterSecret,用服务器公钥加密传输,私钥持有者都能解开。ECDHE:双方交换临时公钥后在本地各自算出共享秘密,秘密从不上链,长期私钥只负责签名认证。

什么是前向安全性?RSA 为什么没有?

前向安全性指长期私钥泄露后历史会话仍然安全。RSA 交换中预主密钥用长期公钥加密,攻击者保存握手流量后,拿到私钥即可解密全部历史会话;ECDHE 每次握手用独立临时私钥,用完销毁,长期私钥泄露也无法回溯。

ECDHE_RSA 里的 RSA 是干什么的?

做身份认证签名,证明临时 ECDHE 参数确实来自持有证书私钥的服务器,防中间人替换;它不参与会话密钥的加密或计算。

TLS 1.3 为什么移除静态 RSA 交换?

静态 RSA 没有前向安全性,私钥泄露影响面覆盖全部历史流量;且有填充预言机的实现风险。TLS 1.3 只保留 (EC)DHE 这类临时密钥协商,同时把密钥交换参数提前到 ClientHello 的 key_share,握手从 2 RTT 压到 1 RTT。

小结

  • RSA 交换是”生成-加密-传输”,ECDHE 是”交换公钥-各自计算”,秘密是否上过网是分水岭。
  • 前向安全性差异的本质:长期私钥是否直接参与每次会话秘密的还原。
  • ECDHE_RSA 中的 RSA 只做签名认证;被淘汰的是 RSA 密钥交换,不是 RSA 算法。
  • TLS 1.3 移除静态 RSA,只留临时密钥协商,安全与握手速度兼得。