BAD SKY.NET

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA

A legacy TLS cipher suite for ECDSA certificates with AES-128-CBC and SHA-1. Chrome does not send it; most libraries do.

TLS cipher suiteCode 0xc009 (49161)legacy

What it is

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (code 0xC009) comes from the elliptic curve TLS specification, now RFC 8422. It uses ephemeral elliptic curve Diffie-Hellman with an ECDSA certificate, AES-128 in CBC mode and HMAC-SHA1 for record integrity.

The key exchange gives forward secrecy, but the record layer has the known problems of CBC with MAC-then-encrypt and relies on SHA-1. RFC 9325 says CBC suites SHOULD NOT be used unless encrypt_then_mac is negotiated.

It is the ECDSA counterpart of TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, which is still in Chrome's list. A server that holds only an ECDSA certificate and supports no AEAD suite would need this one; such servers are very rare today.

Servers can safely leave it disabled: every client in our data that offers it also offers ECDHE suites with AES-GCM, which are stronger in every respect.

Who sends it

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

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

Why it matters for fingerprinting

In our data Chrome 153, curl_cffi and curl-impersonate chrome116 do not send it, although they do send the RSA variant. The Firefox profile of curl-impersonate sends it 11th, Go net/http 7th, Debian curl and Guzzle 22nd, macOS curl 24th and Node.js fetch 26th. Python requests and httpx do not send it either.

So this suite separates the Chrome profile from the Firefox profile, and Go from Python.

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_CBC_SHA in the TLS details.

Run the TLS fingerprint test

References

Related