Nginx的gzip不引发CRIME漏洞,因CRIME针对TLS层压缩而非HTTP层gzip;真正需禁用TLS压缩(现代OpenSSL默认关闭),并加固TLS配置、防范BREACH攻击。

Nginx 中 gzip 本身不引入 CRIME 漏洞,也不需要通过调整 gzip 配置来规避 CRIME。
CRIME(Compression Ratio Info-leak Made Easy)是一种针对 TLS 层压缩(如 TLS-level DEFLATE)的侧信道攻击,它利用压缩率变化推断加密内容中的敏感信息(如 Cookie、CSRF Token)。而 Nginx 的 gzip 模块工作在 HTTP 应用层,是在 TLS 加密之后对响应体做压缩(即:先生成响应 → 再 gzip 压缩 → 再 TLS 加密传输),因此:
- HTTP 层 gzip 不会导致 TLS 压缩相关的 CRIME 风险;
- CRIME 的根本成因是 TLS 协议自身启用的压缩(
TLS compression),该功能早在 2012 年就被发现存在严重风险,主流 TLS 实现(OpenSSL、BoringSSL 等)自 2013 年起默认禁用 TLS 压缩,且现代浏览器已完全移除对它的支持。
所以,真正要规避 CRIME,关键不是动 gzip_* 参数,而是:
确认并禁用 TLS 层压缩
确保你的 Nginx(或上游 TLS 终结组件,如负载均衡器)没有启用 ssl_protocols 或 ssl_prefer_server_ciphers 相关的 TLS 压缩选项 —— 实际上,Nginx 从不支持配置 TLS 压缩(无对应指令),它完全依赖 OpenSSL 行为。只要使用较新版本 OpenSSL(≥1.0.1,推荐 ≥1.1.1),TLS 压缩就是默认关闭的。
你可以验证是否安全:
openssl s_client -connect your-domain.com:443 -tlsextdebug 2>&1 | grep "compression"
若输出中不含 compression: NULL 以外的内容(尤其没有 compression: 1 或 DEFLATE),即表示 TLS 压缩未启用。
更关键的安全实践是停用不安全的 TLS 特性
与其纠结 gzip,不如检查并加固 TLS 配置:
- 禁用 TLSv1.0 和 TLSv1.1(它们缺乏现代防护机制);
- 关闭不安全的密码套件(如含
RC4、EXPORT、NULL、MD5的套件); - 启用 HSTS(
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;); - 避免在 HTTPS 响应中动态拼接用户输入到响应体(这是 BREACH 攻击的温床,而 BREACH 才是 gzip + HTTPS 下需警惕的同类风险)。
⚠️ 注意:BREACH 是 CRIME 的“HTTP 压缩版”,它利用 HTTP 压缩(如 gzip)+ 可预测的敏感数据(如 CSRF token)+ 可控的请求参数 来泄露信息。如果你的页面返回含用户 Session/Token 的 HTML,并允许攻击者诱导用户发起带可控参数的跨域请求,则 gzip 可能成为 BREACH 的助力。此时缓解措施包括:
- 对含敏感字段的响应禁用 gzip(如
/auth,/api/token接口设gzip off;);- 使用随机掩码(masking)混淆敏感值长度;
- 添加随机长度填充(padding);
- 避免在响应体中直接回显未哈希的敏感凭证。
综上:
Nginx 的 gzip on 不导致 CRIME;
CRIME 风险与 Nginx 无关,只取决于底层 TLS 实现是否启用压缩(现代环境默认关闭);
真正需关注的是 TLS 版本/密码套件配置,以及对 BREACH 类攻击的响应设计。
不复杂但容易忽略。


















