nginx https流量清洗需先终止tls,再基于sni、alpn、客户端证书等明文特征实施策略,所有清洗动作必须在解密后执行且适配https生命周期,严禁透传式代理。

在 HTTPS 环境下为 Nginx 配置自动流量清洗,核心不是“加个证书就开洗”,而是确保加密流量可治理:TLS 终止必须前置、清洗逻辑需适配 HTTPS 特征(如 SNI、ALPN、客户端证书)、所有策略判断必须发生在解密之后且不影响 TLS 卸载性能。
先完成 HTTPS 基础卸载,再谈清洗
流量清洗只能作用于明文请求。若 Nginx 仅作透传(如 TCP stream 代理),则无法解析 URI、Header 或 Body,清洗无从谈起。必须让 Nginx 终止 TLS:
- 配置 ssl_certificate 和 ssl_certificate_key,启用 ssl_protocols TLSv1.2 TLSv1.3
- 使用 ssl_prefer_server_ciphers on 和强 cipher suite,避免降级风险
- 若需识别客户端真实 IP,务必开启 proxy_protocol on 并在 upstream 中启用 proxy_protocol 支持(尤其用云 LB 时)
- 禁用 ssl_session_cache builtin:1000 shared:SSL:10m,防止会话复用绕过首次清洗
基于 HTTPS 特征做精准初筛
HTTPS 请求自带更多可信上下文,应优先利用:
- 按 SNI 分流清洗:用 map $ssl_server_name $clean_upstream 匹配不同域名,将 api.example.com 和 www.example.com 路由到不同清洗强度的 upstream
- 校验 ALPN 协议:拒绝非 h2 或 http/1.1 的 ALPN 值(如伪造的 “fakeproto”),用 $ssl_alpn_protocol 变量配合 if 或 map 判断
- 启用并验证客户端证书(可选):对高敏接口(如 /admin/api),设置 ssl_client_certificate 和 ssl_verify_client optional,在 access_by_lua* 中检查 $ssl_client_verify == "SUCCESS" 及证书 SAN 字段
- 透传关键 TLS 元数据:用 proxy_set_header X-TLS-Version $ssl_protocol、X-Cipher $ssl_cipher、X-Client-Cert-Hash $ssl_client_cert(经 sha256 截断)供后端清洗服务建模
清洗动作必须兼容 HTTPS 生命周期
常见错误是把 HTTP 清洗配置直接搬进 HTTPS server 块,忽略 TLS 握手阶段与请求处理阶段的分离:
- 限速不能只靠 limit_req:它基于 $binary_remote_addr,但 HTTPS 下需结合 $ssl_client_fingerprint(OpenResty 提供)或 $ssl_client_cert 哈希,防代理池绕过
- UA 过滤仍有效,但需注意:现代爬虫常伪造主流浏览器 UA 并走 TLS,建议叠加 HTTP/2 HEADERS 帧频率检测(用 Lua 统计 $request_length 与 $http2 在单位时间内的出现次数)
- 重写与拦截必须放在 location 内,且避免在 SSL handshake 完成前触发 —— 所有 return、rewrite、proxy_pass 都属于请求处理阶段,安全
- 日志中务必记录 $ssl_handshake_time 和 $ssl_session_reused,异常短握手时间(95%)是扫描器典型特征
与外部清洗服务安全联动
HTTPS 下更需保障元数据传递的完整性与机密性:
- 向后端清洗服务转发时,改用 proxy_pass https://scrub-service,并配置 proxy_ssl_trusted_certificate 和 proxy_ssl_verify on
- 敏感字段(如原始请求体 hash、$ssl_client_escaped_cert)不要明文传,改用 AES-256-GCM 加密后放入 X-Scrub-Payload header
- 清洗服务返回决策后,Nginx 根据 X-Scrub-Action: block|challenge|pass 执行对应动作;若返回 4xx/5xx,不直接透传给用户,统一跳转至定制化 HTTPS 错误页(/err/captcha.html)
- 所有清洗相关 header(如 X-Scrub-ID、X-Scrub-Score)均设为 underscores_in_headers on 并显式允许,避免被默认丢弃











