# ROBOT是什么？定义、例子与常见误区

> ROBOT 是 2017 年公布的研究，发现大量 TLS 实现仍存在 1998 年的 Bleichenbacher RSA 填充预言机，攻击者可借此解密 RSA 密钥交换。

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

ROBOT 由 Hanno Böck、Juraj Somorovsky 和 Craig Young 于 2017 年 12 月公布。1998 年 Daniel Bleichenbacher 就已证明：如果服务器会透露解密后的 RSA PKCS #1 v1.5 消息填充是否有效，攻击者就能通过大量自适应查询解密密文，或用服务器的密钥伪造签名。此后 TLS 规范一直包含应对措施，但 ROBOT 团队发现，多家主流厂商的产品，包括负载均衡和 TLS 加速设备，仍会通过不同的告警、超时或连接行为泄露这个预言机。它对应多个厂商各自的 CVE 编号，而不是单一编号。

## 为什么重要
使用 RSA [密钥交换](https://ssl.sh/zh/glossary/key-exchange/)的 TLS 会话，可能被事先录下流量、且仍能向有漏洞服务器发起查询的攻击者事后解密，服务器密钥还可能被滥用于签名。给受影响产品打补丁能堵住具体的预言机，但长久之计是停用 RSA 密钥交换：禁用名为 `TLS_RSA_WITH_*` 的套件（OpenSSL 名称如 `AES128-GCM-SHA256`），只保留 [ECDHE](https://ssl.sh/zh/glossary/ecdhe/) 套件，它们同时提供[前向保密](https://ssl.sh/zh/glossary/forward-secrecy/)。TLS 1.3 已完全去掉 RSA 密钥交换。在 ECDHE_RSA 套件中，RSA 证书用于签名仍然没有问题。排查时别忘了负载均衡、WAF 等前端设备，它们往往才是终止 TLS 的地方。

## 例子
```bash
nmap --script ssl-enum-ciphers -p 443 example.com | grep 'TLS_RSA_WITH'
```

没有输出说明未提供 RSA 密钥交换套件。只保留 ECDHE 的 Nginx 套件列表示例：

```nginx
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
```

## 常见误区
- **ROBOT 说明 RSA 证书不能用了。** 问题在于 RSA 密钥交换（加密），而非 RSA 签名；配合 ECDHE 使用的 RSA 证书不受影响。
- **Bleichenbacher 攻击在 1998 年就解决了。** 应对措施早已有之，但各家实现屡屡出错，ROBOT 证明的正是这一点。
- **只有冷门服务器受影响。** 公布时，知名厂商的产品和一些高流量网站都在受影响之列。

## 相关术语

- [RSA](https://ssl.sh/zh/glossary/rsa/): RSA 是 1977 年提出的公钥算法，TLS 用它对证书和握手进行签名，在 TLS 1.3 之前还用它传输会话密钥。
- [密钥交换](https://ssl.sh/zh/glossary/key-exchange/): 密钥交换是 TLS 握手中客户端与服务器建立共享秘密的步骤，保护连接的对称密钥都由这个共享秘密派生而来。
- [ECDHE](https://ssl.sh/zh/glossary/ecdhe/): ECDHE 是椭圆曲线上的临时 Diffie-Hellman 密钥交换，TLS 双方每次握手都生成新的椭圆曲线密钥对，并据此协商出共享密钥。
- [前向保密](https://ssl.sh/zh/glossary/forward-secrecy/): 前向保密是密钥交换的一种安全属性：即使服务器的长期私钥日后泄露，过去连接的会话密钥也不会因此暴露。
- [DROWN](https://ssl.sh/zh/glossary/drown/): DROWN 是 2016 年公布的跨协议攻击（CVE-2016-0800），借助任何支持 SSLv2 的服务器，解密使用同一 RSA 密钥的 TLS 会话。
- [TLS 1.3](https://ssl.sh/zh/glossary/tls-1-3/): TLS 1.3 是当前最新的传输层安全协议版本（2018 年的 RFC 8446，现行规范为 RFC 9846），完整握手只需一个往返，且只保留 AEAD 加密算法。
