BAD SKY.NET

TLS_AES_256_GCM_SHA384

A TLS 1.3 cipher suite with AES-256 in GCM mode and SHA-384 for key derivation, offered by every measured client.

TLS cipher suiteCode 0x1302 (4866)recommended

What it is

TLS_AES_256_GCM_SHA384 (code 0x1302) is a TLS 1.3 cipher suite from RFC 8446. It encrypts records with AES using a 256-bit key in Galois/Counter Mode, and uses SHA-384 in HKDF to derive the session keys from the handshake secret.

As with every TLS 1.3 suite, the name covers only the record encryption and the key derivation hash. The key exchange comes from the supported_groups and key_share extensions, and the certificate type from signature_algorithms.

AES-256 offers a larger security margin than AES-128, which matters mainly for long-term secrecy requirements and for compliance rules that ask for 256-bit keys. It is a little slower than AES-128 but still very fast with hardware AES support. RFC 8446 lists it as a "SHOULD implement" suite, so practically every TLS 1.3 stack supports it.

Who sends it

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

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 TLS 1.3 client offers this suite, so its presence says little on its own. What separates clients is the order: Chrome, curl_cffi and curl-impersonate chrome116 put the three TLS 1.3 suites first in the order AES-128, AES-256, ChaCha20, the Firefox profile of curl-impersonate puts ChaCha20 second, and OpenSSL-based libraries such as Python requests, httpx, Node.js fetch and Guzzle lead with AES-256. Go net/http lists its TLS 1.2 suites first and the TLS 1.3 ones at the end. JA3 keeps that order, while JA4 sorts the suites before hashing, so the order shows up in JA3 but not in the JA4 cipher hash.

In our measurements Python requests, httpx, PHP Guzzle, Node.js fetch and Debian curl send TLS_AES_256_GCM_SHA384 at position 1, which is the OpenSSL default order. Chrome sends it second.

Check whether your client sends it

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

Run the TLS fingerprint test

FAQ

References

Related