JA3 and JA4 fingerprints: what they are and how to get them from a PCAP

Encryption hides what a client says, but not how it starts talking. The first message of every TLS connection lists the client's capabilities in an order that depends on its software. Hash that list and you get a fingerprint that recognises the program behind a connection, whatever address or server name it uses.

By Stuart Mathieson8 minute readWireshark + tsharkUpdated 12 October 2026
The quick way

Upload the capture and PCAPNG Analyzer lists every TLS client by JA4, with the JA3s, hello counts, clients and server names behind each, QUIC included. That table is in the Free tier. In Pro, add a fingerprint to a threat-intel list and every capture is checked for it automatically.

Try it free on your own computer →
In this guide
  1. What a TLS fingerprint captures
  2. JA3 vs JA4
  3. Extract fingerprints
  4. Read the results
  5. Know the limits
  6. Manual vs automated workflow

1. What a TLS fingerprint captures

A TLS connection starts with a ClientHello. It is sent before encryption begins, and it lists the TLS versions, cipher suites, extensions, key-exchange groups, signature algorithms and application protocols (ALPN, such as h2) the client supports. Each TLS library fills these in its own way, so the list identifies the client software, often down to the version:

Servers can be fingerprinted from their reply as well (JA3S, JA4S), and SSH clients and servers from their key-exchange message (HASSH).

2. JA3 vs JA4

JA3 (Salesforce, 2017) joins the version, ciphers, extensions, groups and point formats as decimal numbers, in the order the client sent them, and takes the MD5 hash. It became the common currency of threat-intel feeds.

Since early 2023, Chrome and the browsers built on it have randomised the order of their TLS extensions on every connection. Because JA3 keeps the order, the same browser now produces a different JA3 almost every time. In one home-browsing capture we checked, 587 ClientHellos produced 243 different JA3 hashes.

JA4 (FoxIO, 2023) sorts the ciphers and extensions before hashing, so it stays stable. The same 587 ClientHellos produced 22 JA4 fingerprints. JA4 is also partly readable:

t13d1517h2_8daaf6152771_b6f405a00624
│ │ │ │ │  │            └ hash of the sorted extensions + signature algorithms
│ │ │ │ │  └ hash of the sorted cipher suites
│ │ │ │ └ first application protocol offered (h2 = HTTP/2)
│ │ │ └ 15 cipher suites, 17 extensions
│ │ └ d = a server name (SNI) was sent; i = none
│ └ highest TLS version offered (1.3)
└ t = TLS over TCP; q = QUIC

Use JA4 for anything new, and keep JA3 for matching older intelligence. A JA3 from a modern browser is close to useless on its own.

3. Extract fingerprints from a capture

Current Wireshark versions compute both fingerprints natively; these commands were run with tshark 4.6. List each ClientHello with its client, server name and fingerprints:

tshark -r capture.pcapng -Y "tls.handshake.type == 1" \
  -T fields -e ip.src -e tls.handshake.extensions_server_name \
  -e tls.handshake.ja4 -e tls.handshake.ja3

Count how often each JA4 appears, most common first:

tshark -r capture.pcapng -Y "tls.handshake.type == 1" \
  -T fields -e tls.handshake.ja4 | sort | uniq -c | sort -rn

Then find every connection made by one fingerprint, in Wireshark or tshark:

tls.handshake.ja4 == "t13d1517h2_8daaf6152771_b6f405a00624"

In Wireshark, expand a ClientHello, right-click the JA4 field and choose Apply as Column to see fingerprints alongside every connection. QUIC ClientHellos are matched by the same filter, because Wireshark decrypts QUIC Initial packets; their JA4 starts with q. The related fields are tls.handshake.ja3s for servers and ssh.kex.hassh / ssh.kex.hasshserver for SSH.

4. Read the results

On a typical network, a handful of fingerprints account for most connections: the deployed browsers, the operating system's TLS library, and a few agents. The interesting entries are at the bottom of the count:

Once you know a fingerprint is bad, it becomes an indicator. It keeps matching after the attacker changes infrastructure, until they change their TLS code.

5. Know the limits

A fingerprint is a clue about software, not a verdict about intent.

Combine it with the destination, timing and the host's other activity before drawing conclusions. On its own it can't tell you which process on a machine made the connection.

Manual method vs PCAPNG Analyzer

Manual method

  1. Export ClientHello fingerprints with tshark.
  2. Count and group them by JA4.
  3. Investigate rare fingerprints and their server names.
  4. Look up unknown ones by hand.
  5. Keep a list of bad fingerprints and re-check new captures.

With PCAPNG Analyzer

  1. Upload the capture.
  2. Choose See TLS analysis and read Client fingerprints: each JA4 with its JA3s, clients and server names. Copy any value in one click.
  3. In Pro, add known-bad fingerprints to a threat-intel list. SSH HASSH fingerprints are under Devices & services.
How the app computes them

Fingerprints are computed from each ClientHello reassembled from the original capture, so a modern hello that spans two TCP segments (common now with post-quantum key shares) gets its full fingerprint. QUIC ClientHellos are decrypted from their Initial packets, using keys the packets themselves carry, so HTTP/3 clients get JA4s starting with q. The fingerprint table is part of the Free tier; matching fingerprints against your own lists is Pro.

See every TLS client at a glance

Group connections by JA4 and spot the software that doesn't belong, on a server you control.

Start freeSee a sample incident report