JAx Fingerprint Plugin

Description

The JAx Fingerprint plugin generates client fingerprints based on the JA4+ or JA3 algorithms designed by John Althouse.

Fingerprints can be used for:

  • Client identification and tracking

  • Bot detection and mitigation

  • Security analytics and threat intelligence

  • Understanding client implementation patterns

Plugin Configuration

You can use the plugin as a global plugin, a remap plugin, or both.

To use the plugin as a global plugin, add the following line to plugin.config:

jax_fingerprint.so --standalone

To use the plugin as a remap plugin, append the following line to a remap rule on remap.config:

@plugin=jax_fingerprint.so @pparam=--standalone

To use the plugin in a hybrid setup (both global and remap plugin), configure it in both plugin.config and remap.config without --standalone option.

--standalone

This option enables you to use the plugin as either a global plugin, or a remap plugin. In other words, the option needs to be specified if you do not use the hybrid setup.

--method <JA4|JA4H|JA3>

Fingerprinting method (e.g. JA4, JA3, etc.) to use. This option must be specified.

--mode <overwrite|keep|append>

This option specifies what to do if requests from clients have the header names that are specified by –header and/or –via-header. Available setting values are “overwrite”, “keep” and “append”. The default mode is “overwrite”.

--servernames <servername1,servername2,...>

This option specifies server name(s) for which the plugin generates fingerprints. The value must be provided as a single comma separated value (no space) of server names. If the option is not specified, the plugin generates fingerprints for any server names.

--header <header_name>

This option specifies the name of the header field where the plugin stores the generated fingerprint value. If not specified, header generation will be suppressed.

--via-header <via_header_name>

This option specifies the name of the header field where the plugin stores the generated fingerprint-via value. If not specified, header generation will be suppressed.

--log-filename <filename>

This option specifies the filename for the plugin log file. If not specified, log output will be suppressed.

--log-field <symbol>

This option registers a custom log field with the given symbol name that can be used in logging.yaml log formats. The log field outputs the generated fingerprint value for each transaction. If not specified, no custom log field is registered.

For example, if you specify --log-field jaxja4, you can use %<jaxja4> in your log format string in logging.yaml.

Note

This option is only supported when the plugin is loaded as a global plugin in plugin.config. Log fields are global and must be registered before log formats are parsed at startup. If you use a remap-only setup, you must also load the plugin globally with --log-field to register the log field.

Plugin Behavior

Global plugin setup

Global plugin setup is the best if you:
  • Need a fingerprint on every request

Remap plugin setup

Remap plugin setup is the best if you:
  • Need a fingerprint only on specific paths, or

  • Cannot use Global plugin setup

Note

For JA3 and JA4, fingerprints are always generated at the beginning of connections. Using remap plugin setup only reduces the overhead of adding HTTP headers and logging.

Hybrid setup

Hybrid setup is the best if you:
  • Need a fingerprint only for specific server names (in TLS SNI extension), and

  • Need a fingerprint only on specific paths

Log Output

The plugin outputs a log file in the Traffic Server log directory (typically /var/log/trafficserver/) if a log filename is specified by --log-filename option.

Log Format:

[timestamp] Client: <address>    <method_name>: <fingerprint>

Example:

[Jan 29 10:15:23.456] Client: 192.168.1.100    JA4: t13d1516h2_8daaf6152771_b186095e22b6
[Jan 29 10:15:24.123] Client: 10.0.0.50        JA4: t13d1715h2_8daaf6152771_02713d6af862

Using HTTP Headers in Origin Requests

Origin servers can access the generated fingerprint through the injected HTTP header. This allows the origin to:

  • Make access control decisions based on client fingerprints

  • Log fingerprints for security analysis

  • Track client populations and TLS implementation patterns

The fingerprint-via header allows origin servers to track which Traffic Server proxy handled the request when multiple proxies are deployed.

Debugging

To enable debug logging for the plugin, set the following in records.yaml:

records:
  diags:
    debug:
      enabled: 1
      tags: jax_fingerprint

Requirements

  • Traffic Server must be built with TLS support (OpenSSL or BoringSSL) if you use JA3 or JA4

See Also

Example Configuration

Enable JA4 fingerprinting by hybrid (global + remap) setup

This configuration adds x-my-ja4 header if a connection is established for either abc.example or xyz.example.

plugin.config:

jax_fingerprint.so --method JA4 --servernames abc.example,xyz.example

remap.config:

map / http://origin.example/ @plugin=jax_fingerprint.so @pparam=--method=JA4 @pparam=--header=x-my-ja4