BAD SKY.NET

supported_groups

supported_groups lists the key exchange groups a client supports, such as X25519MLKEM768, x25519 and secp256r1.

TLS extensionCode 0x000a (10)

What it is

supported_groups (extension 10) tells the server which key exchange groups the client can use: elliptic curves such as x25519 and secp256r1, finite-field Diffie-Hellman groups such as ffdhe2048, and post-quantum hybrids such as X25519MLKEM768. It was first defined as elliptic_curves in RFC 4492, now replaced by RFC 8422, and renamed when RFC 7919 added finite-field groups; RFC 8446 uses it for TLS 1.3.

The order is the client's preference. In TLS 1.3 the client also sends a key share for one or two of these groups in key_share, so its favorite group usually comes first and matches the share it sent.

Chrome-based clients put a GREASE value in this list too, as RFC 8701 describes, so servers keep tolerating group codes they do not know.

Servers pick the group from this list.

Who sends it

Chrome 153 (macOS) browser Sent at position 16
curl_cffi (impersonate chrome) Sent at position 7
curl-impersonate chrome116 Sent at position 2
curl-impersonate ff117 Sent at position 4
curl 8.7 (macOS) Sent at position 5
curl 7.88 (Debian 12) Sent at position 3
Python requests Sent at position 4
Python httpx Sent at position 4
Python httpx (HTTP/2) Sent at position 4
Go net/http Sent at position 7
Node.js fetch Sent at position 4
PHP Guzzle Sent at position 4

Measured on 2026-10-25 against our own test server: sent by 12 of 12 clients. Position counts from 1 and ignores GREASE values.

Why it matters for fingerprinting

Every measured client sends it. Its content goes into a dedicated JA3 field, so the groups and their order change the JA3 hash directly. See the supported groups hub for which client offers which group.

Check whether your client sends it

Open the test from your browser, or call it from your script, and look for supported_groups in the TLS details.

Run the TLS fingerprint test

References

Related