一、什么是 JA3
JA3 是把 TLS 客户端握手(ClientHello)里 5 组明文可见的参数——TLS 版本、加密套件列表、扩展列表、椭圆曲线、椭圆曲线格式——按固定顺序拼成字符串再做 MD5,得到一个 32 位哈希值。不同工具/浏览器/木马在握手时给出的参数组合几乎独一无二,因此这条哈希就可以当作“客户端指纹”,在不解密流量的前提下 1~2 ms 内判定“这是哪款程序”。
二、JA3 如何被绕过
-
参数重排:调换加密套件或扩展的顺序即可产生全新哈希。
-
增删冗余:插入 GREASE 值或废弃套件,让特征串变化但不影响握手成功。
-
直接伪造:使用 curl-impersonate、requests-go、ja3transport 等库,把 JA3 字段硬编码成浏览器值;例如把木马指纹改成 Chrome 119 的
d0e89b7f…,WAF 匹配即失效。 -
协议栈切换:用 BoringSSL 替代 OpenSSL,自带字段裁剪与顺序随机化,更容易拼出“合法”指纹。
三、在 DDoS 防护中如何“反制”JA3 绕过
-
双指标限速:
边缘节点先算 JA3,再统计“同一 JA3 的新建连接/秒”;超过阈值即丢包或拉黑洞,即使攻击者换 IP 也逃不掉。 -
指纹+行为模型:
把 JA3 与后续 HTTP 请求频率、URI 离散度、TTL、窗口尺寸等做成复合向量,用机器学习建立基线;仅改 JA3 但行为异常仍会被拦截。 -
实时情报更新:
云端持续收集新出现的“高频陌生 JA3”,10 分钟内下发到清洗集群,对抗 0-day 压测工具 -
JA3S 交叉校验:
同时采集服务器端 JA3S 指纹,若客户端 JA3 伪装成浏览器,但服务器返回的 JA3S 与真实浏览器不一致,即可识别伪造 -
挑战响应:
对命中“可疑 JA3”的流量强制注入 5 秒延迟或 JS 计算,木马一般无法完成,正常浏览器用户几乎无感。
四、实战场景与作用
场景 1:HTTPS 洪水
百万级短连接携带随机 URL,IP 离散度极高;通过“同一 JA3 ≥500 新建/秒”条件即可在 TCP 层直接丢弃,清洗中心压力下降 70%。
场景 2:加密慢速攻击
攻击者用低频率、长连接占用会话表;JA3 异常+会话生命周期双特征可精准拉黑,误杀率 <1%。
场景 3:0-day 压测工具
攻防演练出现新编译工具,JA3 不在旧库;实时聚类发现“突然冒出的高频指纹”,5 分钟内自动生成临时规则并完成全网封锁。
总结
JA3 是“握手即识别”的第一道筛子;虽然伪造难度低,但防护方只要把它与速率、行为、情报、服务端指纹等多维特征联动,就能把 60%~80% 的加密型 DDoS 流量在到达业务前挡掉,显著降低后端清洗成本和业务中断风险。