我们平时看 HTTP 请求,最容易注意到的是 User-Agent、Cookie、Referer 这些 Header。但在 HTTPS 请求真正发送 HTTP 内容之前,客户端会先和服务器完成一次 TLS 握手。这个握手过程也会暴露很多特征,这些特征组合起来,就形成了 TLS 指纹。
TLS 指纹是什么
HTTPS 可以简单拆成两层:
先进行 TLS 握手
再发送 HTTP 请求
TLS 指纹关注的是第一步,也就是客户端发出的 ClientHello。这个包里通常会包含:
- 支持的 TLS 版本
- 支持的加密套件 cipher suites
- 支持的 TLS extensions
- 支持的椭圆曲线 groups
- 签名算法 signature algorithms
- ALPN,例如
h2、http/1.1 - SNI,也就是要访问的域名
不同客户端生成的 ClientHello 不一样。Chrome、Safari、Firefox、curl、Python、Go、Java、Node.js 的 TLS 库都有自己的默认组合、顺序和行为习惯。服务端可以通过这些差异判断:这个请求到底像不像真实浏览器。
为什么 User-Agent 不够
User-Agent 太容易伪造了。脚本可以直接写:
User-Agent: Mozilla/5.0 ... Chrome/142.0.0.0 Safari/537.36
但如果它底层用的是 Python requests、Go net/http 或 Java HTTP 客户端,TLS 握手特征可能仍然不像 Chrome。
这就会出现一种常见矛盾:
HTTP Header 声称:我是 Chrome
TLS ClientHello 表现:我更像 OpenSSL / Go / Java
对网站风控来说,这种不一致就是一个风险信号。
JA3 和 JA4
JA3 是一种经典 TLS 指纹算法。它会从 ClientHello 中提取几个字段,再拼成字符串并计算 MD5。
概念上类似:
TLSVersion,
CipherSuites,
Extensions,
EllipticCurves,
EllipticCurvePointFormats
得到的 hash 可以用来聚合和比较客户端。例如同一个 JA3 在短时间内注册大量账号,就很可疑。
JA4 是更新一代的指纹思路。现代 TLS 里有 GREASE、扩展顺序变化、TLS 1.3 等因素,JA3 有时会不够稳定。JA4 会做更多规范化处理,让指纹更适合现代网络环境。
简单理解:
JA3:老牌 TLS ClientHello 指纹
JA4:更现代、更稳定的一组网络指纹方法
实际业务里,不一定要自己实现 JA3/JA4。很多 CDN、WAF、Bot Management 产品会提供类似能力。
它能识别哪些异常
TLS 指纹通常可以帮助识别:
- 普通浏览器和脚本客户端的差异
- 命令行 curl、Python、Go、Java、Node.js 等默认 TLS 栈
- User-Agent 和 TLS 行为不一致
- 同一个指纹跨大量账号、邮箱、IP 重复出现
- 某些代理、爬虫框架、自动化工具的固定特征
但要注意,TLS 指纹不是身份证。它不能证明某个请求一定来自某个人,也不能证明某个请求一定是攻击。它更像一个“风险线索”。
网站如何用它做防御
比较稳妥的方式不是“一刀切封禁”,而是做风险评分。
可以把这些信号组合起来:
- TLS 指纹是否像浏览器
- User-Agent 和 TLS 指纹是否匹配
- HTTP/2 行为是否正常
- Header 顺序和浏览器是否接近
- IP 是否来自数据中心、代理、异常 ASN
- 同 IP、同网段、同 JA3/JA4 是否高频注册
- 页面访问链路是否完整
- 提交速度是否过快
- 是否加载了必要的 JS、CSS、图片资源
- 是否有正常鼠标、键盘、焦点、滚动等行为
- 邮箱域名、手机号段、设备指纹是否异常
一个简单的策略可以是:
低风险:正常放行
中风险:限速、延迟、要求 JS challenge
高风险:验证码、邮箱或手机二次验证
极高风险:拒绝注册或人工审核
适用场景
TLS 指纹适合用在这些位置:
- 注册接口
- 登录接口
- 找回密码
- 下单支付
- 领券、抽奖、活动报名
- 高频 API
- 内容抓取风险较高的页面
这些场景有一个共同点:一旦被脚本批量调用,会带来账号滥用、资源消耗、库存损失或数据泄露风险。
注意事项
不要只靠 TLS 指纹封禁。原因很简单:
- 企业代理和安全网关可能改变 TLS 行为
- 移动 App、WebView、系统浏览器的表现会有差异
- 攻击者可以用真实浏览器自动化
- 一些工具可以模拟 Chrome 的 TLS 指纹
- CDN 或上游代理可能让你看不到完整原始特征
更推荐把 TLS 指纹作为风控系统里的一个维度。它负责回答“这个客户端像不像它声称的客户端”,而不是独立决定“放行还是封禁”。
一句话总结
TLS 指纹看的是 HTTPS 握手阶段的“身体语言”,HTTP Header 看的是客户端递上来的“名片”。名片可以随便写,身体语言更难完全伪装;但真正可靠的防御,还是要把 TLS 指纹、行为链路、IP 信誉、会话完整性和分层验证组合起来。
Copyright © 2017 - 2026 boboidea.com All Rights Reserved 波波创意软件工作室 版权所有 【转载请注明出处】