HTTPS 握手里的 RSA 和 ECDHE,到底差在哪?(应用层)
HTTPS 并不等于”RSA 加密”。TLS 握手的核心任务是协商出一把对称会话密钥,而 RSA 与 ECDHE 是两条截然不同的协商路径:前者把密钥材料加密后”寄”给服务器,后者让双方各自在本地”算”出同一份秘密。这个差别决定了前向安全性的有无,也解释了 TLS 1.3 为什么把静态 RSA 密钥交换彻底移除。
它解决什么问题
TLS 握手要同时回答两个问题。一是密钥怎么来:握手结束后业务数据用 AES-GCM 这类对称算法保护,双方必须先安全地得到同一把会话密钥。二是身份怎么证:客户端要确认对端真的是目标服务器,而不是中间人塞过来的假公钥——这靠证书与 CA 信任链解决。
RSA 与 ECDHE 在身份认证上做法一致(都用证书签名),分歧集中在第一个问题上:会话密钥的材料,到底是”一方生成、加密传输”,还是”双方协商、各自计算”。
核心原理
RSA 握手:客户端生成,加密传输
TLS 1.2 的静态 RSA 握手流程:
Client Server |
分四步:
- 客户端发送支持的 TLS 版本、密码套件列表和随机数 Client Random。
- 服务器回选定套件、随机数 Server Random 和证书链,客户端验证证书。
- 客户端生成 48 字节的预主密钥(PreMasterSecret),用证书中的 RSA 公钥加密后发出。
- 服务器用 RSA 私钥解密得到同一份预主密钥,双方结合两个随机数派生出会话密钥。
整个方案的安全押在一把长期不变的服务器私钥上——这正是问题的根源。
ECDHE 握手:交换公钥,各自计算
ECDHE(Ephemeral Elliptic Curve Diffie-Hellman,临时椭圆曲线 DH)的思路是:共享秘密从不上网传输。双方各生成一对临时密钥,只交换临时公钥,然后用”自己的临时私钥 + 对方的临时公钥”在本地算出同一份共享秘密。攻击者即便全程抓包,看到的也只有两个公钥,无法推出秘密。
Client Server |
注意 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,只留临时密钥协商,安全与握手速度兼得。

