我们平时看 HTTP 请求,最容易注意到的是 User-AgentCookieReferer 这些 Header。但在 HTTPS 请求真正发送 HTTP 内容之前,客户端会先和服务器完成一次 TLS 握手。这个握手过程也会暴露很多特征,这些特征组合起来,就形成了 TLS 指纹。

TLS 指纹识别流程

TLS 指纹是什么

HTTPS 可以简单拆成两层:

先进行 TLS 握手
再发送 HTTP 请求

TLS 指纹关注的是第一步,也就是客户端发出的 ClientHello。这个包里通常会包含:

  • 支持的 TLS 版本
  • 支持的加密套件 cipher suites
  • 支持的 TLS extensions
  • 支持的椭圆曲线 groups
  • 签名算法 signature algorithms
  • ALPN,例如 h2http/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 波波创意软件工作室 版权所有 【转载请注明出处】