防范BEAST攻击的核心是禁用TLS 1.0/1.1、排除CBC套件、启用AEAD加密并配合ssl_prefer_server_ciphers on确保服务端主导协商;单设该指令无效,必须与协议版本和cipher列表协同生效。

要防范 BEAST 攻击,核心不是修补客户端行为,而是从 Nginx 网关层切断其利用条件:禁用 TLS 1.0、排除 CBC 模式套件、确保服务端主导加密协商顺序。关键不在“开不开 ssl_prefer_server_ciphers”,而在于它和 cipher 列表、协议版本是否协同生效。
禁用 TLS 1.0/1.1,从根源移除 BEAST 可利用环境
BEAST 仅影响 TLS 1.0(及部分 TLS 1.1 实现),攻击依赖 CBC 模式下可预测的 IV。只要不提供 TLS 1.0 握手能力,攻击面即消失。
- 在 server 或 http 块中明确写入:ssl_protocols TLSv1.2 TLSv1.3;(务必不含 TLSv1.0 和 TLSv1.1)
- 不要写成
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3—— 即使 TLS 1.2 是主力,保留 TLS 1.1 仍可能被降级或触发兼容性协商漏洞 - TLS 1.3 自动规避 BEAST,且不依赖 ssl_ciphers 和 ssl_prefer_server_ciphers,但它的启用前提是上层协议不开放旧版本
配置强 cipher 列表并严格排序,剔除所有 CBC 和非 AEAD 套件
Nginx 按从左到右顺序匹配第一个客户端支持的套件。若列表里混入 ECDHE-RSA-AES128-SHA 这类 TLS 1.0 兼容的 CBC 套件,哪怕排在末尾,只要客户端只支持它,就会被选中——BEAST 风险重现。
- 推荐 cipher 字符串(兼顾安全性与主流兼容性):
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305"; - 必须主动过滤弱算法:
!RC4:!MD5:!SHA1:!DES:!3DES:!EXPORT:!aNULL:!eNULL:!CBC(注意:Nginx 不识别!CBC,实际靠不写任何-CBC-套件来实现) - 避免使用宽泛表达式如
ALL:!aNULL或HIGH—— 它们会隐含引入老旧 CBC 套件
开启服务端套件优先权,并确认其作用边界
ssl_prefer_server_ciphers on 不是独立防护开关,而是让上述 cipher 列表真正起效的“执行开关”。它只对 TLS 1.2 协商有效(TLS 1.3 固定套件,无需该指令)。
- 必须显式配置:ssl_prefer_server_ciphers on;(默认为 off,不写等于未启用)
- 该指令确保:即使客户端发送的 ClientHello 包含大量弱套件(如
RSA-AES128-SHA),Nginx 也只从中挑选自己 cipher 列表里第一个匹配项,而非顺从客户端首选 - 它不改变套件本身安全性,只改变选择逻辑——所以必须和干净、强序的
ssl_ciphers配合使用
补充加固项:ECDHE 曲线与实测验证不可省略
前向保密(PFS)和密钥交换效率直接影响连接安全与性能,而真实生效需验证,不能仅依赖配置文件。
- 指定高效安全曲线:ssl_ecdh_curve secp384r1:prime256v1;(提升 ECDHE 性能,同时兼容 iOS/Android 主流设备)
- 用 OpenSSL 实测协商结果:
openssl s_client -connect yoursite.com:443 -tls1_2 -cipher 'ALL' 2>/dev/null | grep 'Cipher is'
输出应为AES128-GCM-SHA256或CHACHA20-POLY1305-SHA256,而非AES128-SHA或DES-CBC3-SHA - 配合 HSTS 头(
Strict-Transport-Security: max-age=31536000; includeSubDomains)防止协议降级劫持


















