什么是 JA3 指纹?TLS 信号及其局限性

什么是 JA3 指纹?

Scrapeless Agent Browser 提供托管的云浏览会话,用于执行和检查动态网页工作流。

JA3 指纹表示什么?

JA3 指纹是从 TLS 客户端的 ClientHello 消息中选定字段派生出的紧凑标识符。它描述的是客户端开始 TLS 连接的某些方式。安全团队可以用它将具有相同握手模式的连接归为一组,并将这些分组与其他证据一起调查。

JA3 不会读取页面的 DOM、图形输出、cookie 或账户身份。它的观察点是连接握手。同一个客户端实现可以运行在许多设备上,因此共享的 JA3 值并不能证明这些连接来自同一个人或同一台机器。

最初的 JA3 算法 定义了所选字段及其序列化方式。原始代码仓库已存档,并引导读者关注较新的工作。现有基础设施仍然可以生成 JA3 值,但分析人员应当区分已文档化的算法与对项目持续维护状态的假设。

要点

  • JA3 对选定的 ClientHello 字段进行概要概括。 它是一种网络层面的观测,而不是页面级的浏览器测量。
  • JA3 在序列化列表中保留顺序。 列表顺序的变化会改变生成的指纹。
  • 匹配的 JA3 是辅助证据。 它不能对设备进行认证,也不能确定意图。
  • 可靠采集需要正确的观测点。 仅靠应用层 JavaScript 无法重建远端服务器所观察到的握手。

JA3 值是如何构造的?

JA3 将选定的 ClientHello 字段序列化为一个由分隔符组成的字符串,并对该字符串进行 MD5 哈希。选定的类别包括 version 字段、cipher suites、extensions、supported groups 和 elliptic-curve point formats。原始描述在 supported groups 上仍使用较旧的“elliptic curves”术语。

在每个类别内,数值使用连字符分隔;类别之间使用逗号分隔。顺序很重要。两个具有相同扩展集合但顺序不同的握手,因此可能生成不同的 JA3 输入。摘要使输入更易于存储和比较,但不会保留对字段的可读解释。

JA3 会从相关列表中排除 GREASE 值。 TLS 可扩展性中的 GREASE 使用保留值来测试实现是否能够容忍不熟悉的值。若将这些变化的值视为稳定的客户端特征,会给指纹带来噪声。

version 字段需要谨慎解读。现代 TLS 并不会在一个传统字段中表达所有版本细节。 TLS 协议定义 解释了握手结构和支持版本的协商方式。JA3 的 version 组件不应被解读为对最终协商协议版本的完整陈述。

当诊断目标和数据策略允许时,应保留原始的规范化输入。仅有摘要便于分组,但保留原始字段类别可以解释为何一次更新会改变结果。哈希是比较键,而不是对握手含义的分析。

必须在何处测量 JA3?

必须在可以观察到相关 ClientHello 的位置测量 JA3。终止 TLS 的边缘节点、合适的网络传感器或诊断服务器都可以提供这种观测。位于单独 TLS 终止器之后的应用可能无法接收到原始握手。

在解读一个值之前,先画出连接路径。浏览器可能通过一个隧道连接,将其握手向前传递。终止 TLS 并新建另一连接的网关会为下一个跳点创建不同的握手。路由流量的地址与生成被观察到 TLS 消息的软件不一定是同一个组件。

应用可以在元数据字段中从受信任的基础设施接收一个指纹,但信任边界很重要。由用户提供、以某种指纹命名的 HTTP 头,并不能证明边缘节点实际观察到了什么。边缘节点应控制该元数据,并防止调用方替换为自己声称的值。

页面 JavaScript 无法通过标准浏览器 API 恢复完整的原始 ClientHello。网站可以通过从后端观察者获取结果来展示 JA3。没有此类后端的仅浏览器诊断工具,应将该值报告为不可用。

JA3 能告诉安全分析人员什么?

JA3 能帮助分析人员发现具有共同 TLS 客户端模式的连接,并将这种模式与其他事件证据进行比较。它有助于分组、提出假设,以及检测已知环境中的变化。

假设某个内部服务在依赖项更新后开始产生新的 JA3。该观测可以将注意力引向网络栈,但并不证明新的客户端是恶意的。在将此变化归类为安全事件之前,应确认更新并比较原始握手字段。

反过来也同样重要。不受欢迎的客户端可能与普通软件共享一个 JA3 值。匹配到一种被广泛使用的指纹,不应在不考虑受保护操作及其他观测的情况下直接导致一刀切的拒绝。常用的客户端库自然会产生大批相似的连接。

观测合理解读不被支持的结论
相同 JA3 值选定的规范化握手字段生成了相同的摘要两个连接属于同一个人
更新后 JA3 发生变化被观察到的握手模式可能发生了改变该更新必然引入了滥用行为
与某次事件相关联的 JA3该模式是一个有用的调查线索每个匹配的连接都是恶意的
未记录 JA3 值观察或集合可能不可用该客户端没有 TLS 特征

JA3、JA3S、JA4 和浏览器指纹

JA3 描述了 TLS 客户端模式,而 JA3S 描述了已选定的服务器握手特征。它们的组合上下文有助于区分交互,但二者都不是身份凭证。服务器的响应也取决于客户端提供了什么。

JA4 是一种具有不同规范化方式和结构化表示的独立指纹方法。你不能将 JA3 摘要重命名为 JA4,也不能直接从一个推断出另一个。如果某个事件平台同时支持二者,请与取值一并存储算法名称和采集版本。

浏览器指纹收集诸如本地化设置、屏幕信息以及渲染行为等特征。这些属性存在于另一个层面。更改 User-Agent 字符串并不会指示 TLS 库生成特定的 ClientHello,而匹配的 TLS 指纹也不能证明页面脚本所看到的是一个一致的浏览器环境。

MD5 在 JA3 中用作紧凑表示方式。它不应被视为加密身份保证。不同的输入可能发生碰撞,且许多客户端可能有意或自然地共享相同的规范化输入。运营分析应当在这些限制范围内进行。

你应如何诊断疑似 TLS 不匹配问题?

通过将受控环境中测得的握手进行比较来诊断疑似的 TLS 不匹配,然后检查访问结果是否真的与这些差异相关联。仅凭一次被拒绝的请求不足以将 TLS 确定为原因。

  1. 绘制路径。 识别客户端进程、代理行为、TLS 终止器和后端。说明该测量描述的是哪条连接。
  2. 记录环境。 将客户端和网络库的版本与观测结果一起保留。避免在仅基于某个特定构建的情况下,对某种语言整体归因某个数值。
  3. 检查原始字段差异。 确定该变体与排序、提供的功能还是收集行为有关。
  4. 比较应用程序结果。 检查最终响应和预期字段。成功的握手仍可能导致被拒绝或无关的页面。
  5. 请提供需要翻译的英文文本。 说明发生了哪些变化,以及哪些内容仍不确定。在声称某个第三方安全系统使用了特定规则之前,先获取站点所有者的遥测数据。

对这些检查要针对你控制或有权限检查的端点运行。诊断服务只会报告它在自身连接上观察到的情况;这并不一定能重现通往另一个网站的路径。

托管浏览器的作用所在

当应用程序不仅需要一个 HTTP 响应,还需要浏览器运行时、动态渲染以及可控的会话时,受管浏览器会有所帮助。 Scrapeless 代理浏览器简介 描述了此范围,并且 Agent Browser 产品概览 解释其浏览器自动化接口。

使用浏览器并不能证明符合所有访问策略的要求。请验证目标站点,检查其内容,并核对你被允许执行任务的输出。不要承诺某项服务可以分配任意的 JA3 摘要,除非该能力已被明确记录并经过测试。

相关 Python 浏览器指纹工作流程 讨论了基于浏览器的收集上下文。目前 无抓取定价 应根据你的工作负载对运行时和可用结果的要求进行评估,而不是以握手式匹配来替代对内容的验证。

结论

JA3 将选定的 TLS 握手特征压缩为一个便于对流量进行分组的数值。其有效性取决于数据的正确采集、对连接的清晰归属,以及对结果的谨慎解读。在将指纹与访问决策关联之前,应保留算法所处的整体上下文,并审视其在具体应用中的表现。

构建一个可验证的工作流

选择适用于你的许可数据源的 Scrapeless 服务,然后根据你的应用程序所需的字段检查返回的内容。

今天注册即可获得 5 美元免费额度 — 无需信用卡.

领取您的 $5 额度 →

常见问题解答

问:JA3 指纹是唯一的浏览器标识符吗?

JA3 指纹并不是唯一的浏览器标识符。多个客户端可以共享相同的已选握手字段,从而具有相同的摘要。

问:更改 User-Agent 会改变 JA3 吗?

仅更改 User-Agent 不会改变 TLS ClientHello。HTTP 头和 TLS 握手的生成属于不同的层。

问:浏览器 JavaScript 能计算服务器所看到的 JA3 吗?

浏览器 JavaScript 无法独立重建服务器所观察到的完整握手过程。必须由后端或网络测量提供该观测数据。

问:代理一定会改变 JA3 吗?

代理并不一定会改变 JA3。结果取决于它是透传客户端握手还是终止 TLS 并创建新连接。

参考文献