防范TLS侧信道攻击需禁用TLS压缩、约束HTTP/2 HPACK参数、阻断响应体长度泄露、削弱时间侧信道:禁用TLS层压缩,限制HTTP/2头部大小与连接请求数,敏感接口禁用gzip,统一错误响应,控制超时与请求速率,隐藏服务器指纹。

防范 TLS 加密侧信道攻击(如 CRIME、BREACH、TIME 等),关键不是让 Nginx 去“解密分析”流量,而是切断攻击依赖的压缩反馈路径、控制敏感信息泄露渠道,并限制攻击者可观察的响应特征。Nginx 本身不执行 TLS 层压缩,但若配置不当,会无意中放大侧信道风险。
禁用 TLS 层压缩(必须项)
CRIME 攻击利用的是 TLS 记录层的压缩(DEFLATE),而非 HTTP/2 的 HPACK。只要 TLS 压缩开启,攻击者就能通过观察加密后密文长度变化推断明文内容(如 Cookie 中的 CSRF Token)。
- 确认 OpenSSL 编译时未启用
--enable-tls-compression - Nginx 配置中显式关闭:在
server或http块中添加ssl_prefer_server_ciphers on;(虽不直接禁用压缩,但配合现代 cipher suite 可规避弱协商) - 更可靠的做法是升级 OpenSSL ≥ 1.1.1 并检查运行时是否启用压缩:执行
openssl version -a和openssl ciphers -V 'ALL:COMPLEMENTOFDEFAULT' | grep -i compress,结果应为空
严格约束 HTTP/2 HPACK 行为
HTTP/2 使用 HPACK 压缩头部,虽所有 header 均在 TLS 加密通道内传输,但响应体长度、帧大小、连接复用行为仍可能构成侧信道。Nginx 提供有限但关键的控制参数:
-
http2_max_field_size 8k;:防超长字段(如恶意构造的Cookie)触发 HPACK 解压异常或内存耗尽 -
http2_max_header_size 32k;:限制整请求 header 总体积,避免攻击者用大量小 header 混淆动态表状态 -
http2_max_requests 500;:单连接最大请求数,防止长期复用导致动态表积累过多敏感 header 模式
阻断响应体长度泄露路径(针对 BREACH)
BREACH 利用 HTTP 响应体中可预测内容(如错误提示、CSRF token 回显)与 gzip 压缩后的长度关联性进行推测。Nginx 不处理响应体压缩(那是 gzip 模块的事),但可协同防御:
- 对含敏感输出的接口(如
/api/user、/login),禁用响应体压缩:gzip off;或用gzip_disable "msie6";+ 精确 location 匹配关闭 - 避免在响应中直接回显用户可控输入(如搜索关键词、错误消息中的原始参数),由后端做脱敏或统一错误码
- 对 JSON 接口强制设置
Content-Encoding: identity,并确保后端不额外启用 gzip
削弱时间类侧信道(TIME / HEIST)
这类攻击通过测量响应延迟差异推测内容存在性(如判断某条记录是否存在)。Nginx 可通过标准化响应节奏降低精度:
-
send_timeout 12s;:控制发送响应的超时,避免因后端慢响应暴露业务逻辑分支 - 对高敏感接口(如鉴权、查询),启用
limit_req zone=secure_api burst=3 nodelay;,平滑请求节奏,掩盖真实处理时间 - 禁用
server_tokens off;并移除所有自定义响应头中的版本/调试信息,减少指纹暴露面


















