BAD SKY.NET

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

A TLS 1.2 cipher suite for ECDSA certificates: ECDHE key exchange with forward secrecy and AES-128-GCM encryption.

TLS cipher suiteCode 0xc02b (49195)recommended

What it is

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (code 0xC02B) is a TLS 1.2 cipher suite defined in RFC 5289. It uses ephemeral elliptic curve Diffie-Hellman for the key exchange, an ECDSA certificate for server authentication, AES with a 128-bit key in Galois/Counter Mode for the records, and SHA-256 for the TLS 1.2 PRF.

It is the ECDSA twin of TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256. The only difference is the certificate type: a server with an ECDSA certificate can choose this suite, a server with an RSA certificate cannot. Clients offer both so they can talk to either kind of server.

ECDSA certificates are smaller and faster to verify than RSA certificates of similar strength. The suite has forward secrecy and authenticated encryption, and RFC 9325 lists it among the recommended TLS 1.2 suites.

A server picks it only when TLS 1.2 is negotiated, the client offers it, and the server holds an ECDSA certificate.

Who sends it

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

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 offers it. Go net/http puts it first of all its suites, because Go lists its TLS 1.2 suites before TLS 1.3. Chrome, curl_cffi and curl-impersonate send it 4th, right after the three TLS 1.3 suites. Python requests and httpx send it 6th, Node.js fetch 5th, Debian curl and Guzzle 10th, and macOS curl 20th.

Those positions are part of the JA3 string, so this one suite already helps separate Go, Python, Node.js and browser-like clients.

Check whether your client sends it

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

Run the TLS fingerprint test

References

Related