http/2启用后需协同加固tls配置、hpack参数与安全响应头:必须在listen 443 ssl http2块中配置add_header ... always,禁用tls压缩,强制tls 1.2+及前向保密套件,并调优http2_max_field_size等参数防资源耗尽。

HTTP/2 本身不改变安全头的生效逻辑,但它的启用会强化 HTTPS 的依赖性与传输效率,因此必须将安全响应头与 TLS 层配置、HPACK 行为协同加固,不能只套用 HTTP/1.1 的旧思路。
必须在 HTTPS server 块中启用并绑定安全头
HTTP/2 要求 ALPN 协商且仅支持 TLS 1.2+,所有安全头必须写在启用 ssl 和 http2 的 server 块内,否则可能被忽略或失效:
-
listen 443 ssl http2;是启用 HTTP/2 的前提,不可只写http2而漏掉ssl - 所有
add_header必须带always参数,确保重定向(301/302)、错误(4xx/5xx)等非 2xx 响应也携带安全头 - 避免把安全头写在
http{}块全局继承——不同站点对X-Frame-Options、Content-Security-Policy的需求差异大,混用易引发跨域拦截或管理后台无法加载资源
配合 TLS 配置堵住侧信道与降级风险
HTTP/2 的 HPACK 头部压缩运行在 TLS 之上,其安全性高度依赖 TLS 层是否干净。光加安全头不够,必须同步收紧 TLS:
- 禁用 TLS 层压缩:
ssl_prefer_server_ciphers on;+ 确保 OpenSSL 不启用SSL_OP_NO_COMPRESSION(Nginx 1.19.4+ 默认已禁) - 强制 TLS 1.2/1.3:
ssl_protocols TLSv1.2 TLSv1.3;,彻底移除 TLS 1.0/1.1 - 选用前向保密套件:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:…;,禁用 RC4、NULL、EXPORT 类弱套件 - 关闭会话票据:
ssl_session_tickets off;,防止攻击者利用票据推测 HPACK 动态表内容模式
限制 HPACK 相关参数防资源耗尽
Nginx 不开放 HPACK 编码策略调整,但可通过以下参数控制解压边界,避免恶意构造 Header 触发内存溢出或解压异常:
-
http2_max_field_size 8k;:单个 Header 字段上限(默认 4KB),建议按业务略放宽,但不超过 16KB -
http2_max_header_size 64k;:整套请求 Header 总大小(默认 16KB),高交互后台可设为 32–64KB -
http2_max_requests 500;:单连接最大请求数(默认 1000),降低长期连接中 HPACK 动态表累积敏感字段的风险
传输防护类安全头需按场景细化
HTTP/2 下多路复用和服务器推送特性会影响部分安全头的实际效果,需针对性配置:
-
Strict-Transport-Security必须启用:add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;,HTTP/2 客户端更依赖 HSTS 实现快速 ALPN 协商 -
X-Frame-Options推荐DENY(管理后台)或SAMEORIGIN(主站),HTTP/2 推送资源若含 iframe,错误设置会导致整个页面加载失败 -
Content-Security-Policy需显式允许frame-src或child-src(HTTP/2 中 iframe 加载走独立流),避免误拦截推送的子资源 - 禁用缓存相关头要谨慎:
Cache-Control: no-store对 HTTP/2 推送资源无效,管理后台建议用no-cache, must-revalidate替代











