BAD SKY.NET

TLS_DHE_RSA_WITH_AES_128_GCM_SHA256

A TLS 1.2 cipher suite with finite-field Diffie-Hellman key exchange and AES-128-GCM. Libraries offer it, browsers do not.

TLS cipher suiteCode 0x009e (158)legacy

What it is

TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (code 0x009E) is a TLS 1.2 cipher suite defined in RFC 5288. It uses ephemeral finite-field Diffie-Hellman (DHE) for the key exchange, an RSA certificate, AES-128 in Galois/Counter Mode for the records and SHA-256 for the PRF.

Like ECDHE, DHE gives forward secrecy, but it is much slower for the same security level, because it works with large numbers instead of elliptic curve points. In TLS 1.2 the server also picks the Diffie-Hellman group on its own, and weak or badly generated groups led to problems such as the Logjam attack. RFC 7919 later added named finite-field groups to fix the group choice.

RFC 9325 says TLS 1.2 implementations SHOULD NOT negotiate TLS_DHE_* suites, and its list of recommended TLS 1.2 suites contains only ECDHE suites.

Who sends it

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

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

Why it matters for fingerprinting

None of the Chrome-like clients we measured offer any DHE suite. OpenSSL-based clients such as Python requests, httpx, Node.js fetch and Guzzle, and both curl builds, still do, so any TLS_DHE_ suite in a ClientHello is a strong sign that the client is not a current browser.

Positions in our data: 8th for Node.js fetch, 12th for Debian curl and Guzzle, 15th for Python requests and httpx, and 25th for macOS curl.

Check whether your client sends it

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

Run the TLS fingerprint test

References

Related