The TLS handshake, slowly
Why it matters Before a single byte of a web page loads, your browser introduces itself to the server in a message anyone on the path can read. That introduction is detailed enough to tell browsers apart, even with cookies blocked. This lesson reads it line by line, so the fingerprint lessons that follow make sense.
Think of meeting someone who only speaks some of your languages. Before you talk properly, you list what you can do: "I speak English, French and a little Japanese; I can write in pen or pencil." They pick one of each. Your list, and the order you say it in, says a lot about where you learned.
Handshake: the short exchange at the start of a TLS connection where the browser and server agree how to encrypt, and the server proves who it is. Only after it finishes is the content sealed.
ClientHello: the very first handshake message, sent by the browser (the client). It lists everything the browser supports. It travels before encryption is set up, so it is readable on the network.
What a ClientHello lists
Here is a simplified one from Cobalt, one of the three fictional browsers in our practice world. Each item is a number from an official registry; the names are in brackets.
legacy version 771 (means TLS 1.2, kept for old servers)
supported versions [772, 771] (TLS 1.3, TLS 1.2)
cipher suites [4866, 4865, 4867, 49196, ...]
extensions [0, 10, 11, 13, 16, 23, 35, 43, 45, 51, 65281, 21]
groups [29, 23, 25, 24]
point formats [0]
server name (SNI) shopa.example
ALPN ["h2", "http/1.1"]Line by line:
- Versions. Which versions of TLS the browser can speak. The old
versionfield always says TLS 1.2 (771) for compatibility; the real list is in thesupported_versionsextension, where 772 means TLS 1.3. - Cipher suites. Recipes for encrypting, in the browser's order of preference.
- Extensions. Optional features, each with a number: 0 is the server name, 16 is ALPN, 43 is supported versions, 51 carries the key share for TLS 1.3.
- Groups. Which kinds of key exchange maths the browser offers (lesson 81's public key idea).
- SNI. The site name, from lesson 82.
- ALPN. Which web protocol to use inside:
h2is HTTP/2,http/1.1the older one.
Cipher suite: a named recipe for encrypting a connection: which encryption and which checks to use. Each has a number, such as 4865.
Extension: an optional extra in the handshake, identified by a number. Browsers send a dozen or more, and which ones they send, and in what order, depends on the browser and its version.
Then the server answers
The server replies with a ServerHello: "we will use TLS 1.3, this cipher suite, this group". In TLS 1.3, almost everything after that, including the server's certificate, is already encrypted. So the ClientHello is the one large, readable message from your side.
Why it works as a fingerprint
Each browser engine builds its ClientHello in its own way, so the lists differ between browsers, and between versions of the same browser. A server, or anything on the path, can read it before the page loads, without cookies, without JavaScript, and without you seeing anything.
One more detail you will meet in the next lesson. Some browsers sprinkle in deliberately meaningless numbers called GREASE values (from RFC 8701), such as 2570 (0x0A0A in hexadecimal), so that servers learn to ignore numbers they do not recognise instead of breaking. They change from connection to connection, so fingerprinting tools skip them.
A common misconception: "Encrypted Client Hello hides my handshake fingerprint". ECH encrypts an inner ClientHello holding the real site name, but it is wrapped inside an outer ClientHello that is still readable, and the outer one still reflects the browser that built it. ECH hides where you go more than what you use.
Try it In Chrome or Edge, open a site, open DevTools and look for the Security panel (in newer versions it may be called Privacy and security; if you cannot see it, find it under the >> menu of more panels), then select the site. You will see the agreed TLS version (such as TLS 1.3), the key exchange group and the cipher. Those are the server's choices from the lists your browser offered in its ClientHello.
Recap
- The ClientHello is the browser's opening list of versions, cipher suites, extensions, groups, the site name and ALPN.
- It is readable before encryption starts, so the network and the server both see it.
- Different browsers build different lists, which makes it a fingerprint without cookies or scripts.
- GREASE values are deliberate random fillers that fingerprints skip.
This lesson is locked
Lessons open one at a time. Finish the previous lesson to unlock this one.