nginx默认禁用tls压缩,无需额外配置,但需确认openssl≥1.1.0且未启用unsafe选项;同时必须在每个server块中配置ssl_protocols tlsv1.2 tlsv1.3、禁用弱套件、开启ssl_prefer_server_ciphers和ssl_session_tickets off,并通过openssl实测验证。

关闭不安全的 TLS 压缩算法,核心是禁用 TLS 层压缩(而非 HTTP/2 的 HPACK),这是防范 CRIME 类侧信道攻击的关键一步。Nginx 本身不启用 TLS 压缩,默认已安全,但需确认底层 OpenSSL 未开启、配置无误、且不被第三方模块绕过。
禁用 TLS 层压缩(防 CRIME 攻击)
TLS 压缩与 HTTP/2 的 HPACK 完全无关——CRIME 攻击利用的是 TLS 记录层的压缩机制,它会将明文 Header 与攻击者可控内容一同压缩,通过响应长度变化推断敏感信息(如 Cookie)。HPACK 在加密后运行,本身不构成该风险。
- 现代 OpenSSL(≥1.1.0,推荐 1.1.1w 或 3.0.13+)默认禁用 TLS 压缩,无需额外配置
- 检查 /etc/ssl/openssl.cnf,确保 Options = UnsafeLegacyRenegotiation 这一行已被注释或删除
- 若自行编译 OpenSSL,编译时不得加 --enable-unsafe-renegotiation 或 --enable-tls1_3 以外的危险选项
- Nginx 配置中没有
ssl_compress类指令,也不应通过第三方模块(如自定义 SSL_CTX)重新启用 TLS 压缩
同步关闭其他不安全 TLS 特性
仅关 TLS 压缩不够,还需切断相关攻击面:
- 明确禁用旧协议:ssl_protocols TLSv1.2 TLSv1.3;(必须放在每个
server块内,不能写在http或location中) - 禁用弱密码套件:排除含 RC4、DES、3DES、MD5、SHA1 的所有 cipher,例如使用
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384"; - 启用服务端优先:ssl_prefer_server_ciphers on;,防止客户端强制协商弱算法
- 关闭会话票据:ssl_session_tickets off;,避免票据重放辅助推测 Header 模式
验证是否真正生效
配置修改后必须实测,不能只依赖语法检查:
- 测试 TLS 压缩是否关闭:
openssl s_client -connect example.com:443 -tls1_2 -crlf,返回中不应出现 Compression: 1 (zlib compression) - 测试旧协议是否被拒:
openssl s_client -connect example.com:443 -tls1_1应直接失败,无证书返回 - 用 SSL Labs 测试页 全面扫描,重点关注 “Compression” 和 “Vulnerabilities” 栏目











