TLS Client Test

See the exact TLS handshake your browser sent us: every cipher suite it offered, every extension it listed, and the JA3 fingerprint a server would use to identify it. Terminated on our own Go backend — no third-party probe.

Handshaking with TLS probe…

How we read your ClientHello

The page you are reading is served by Next.js, but the TLS probe runs on a separate subdomain (tls.browserinspector.com) backed by a small Go service we wrote for this tool. The Go server terminates TLS directly — no CDN or reverse proxy in between — so when your browser connects, the service can peek at the raw bytes of the first record (the ClientHello) before handing the connection to the standard TLS library. The parsed record is then stored against your connection and returned as JSON when your browser calls /api/tls over the same handshake.

The JA3 fingerprint shown is computed exactly as Salesforce defined it in 2017: TLSVersion,Ciphers,Extensions,Groups,ECPointFormats, each a dash-separated list of decimal IDs, the whole string MD5-hashed. GREASE values (the randomized IDs Chrome and Firefox inject to prevent protocol ossification) are filtered out before hashing, matching common JA3 implementations.

What this tells you about your browser

Bot detection. CDNs like Cloudflare and fraud vendors match your JA3 hash against known browser fingerprints. A hash that looks like Chrome but a User-Agent that says Python is a red flag; one that matches your claimed browser is implicit proof you are a real browser.
OS fingerprinting. Safari uses the system TLS stack, so the JA3 changes with the macOS or iOS version. Chrome uses BoringSSL, so its JA3 is the same across platforms but changes with each major Chrome release.
Post-quantum readiness. If X25519MLKEM768 or X25519Kyber768Draft00 appears in your supported groups, your browser is offering a post-quantum key exchange.
TLS 1.3 everywhere. Every modern browser offers TLS 1.3 first, and all five TLS 1.3 cipher suites (TLS_AES_128_GCM_SHA256 and friends) show up near the top of the cipher list.

Frequently Asked Questions

What is a TLS ClientHello?

When your browser opens an HTTPS connection, the very first message it sends is the ClientHello. It advertises which TLS versions the browser understands, a prioritized list of cipher suites, the cryptographic groups and signature algorithms it can use, the server name it's connecting to (SNI), the application protocols it wants (ALPN — 'h2' for HTTP/2, 'http/1.1' for the older protocol), and a handful of other extensions. The server picks one option from each list and responds. This page shows exactly what your browser sent us.

What is a JA3 fingerprint?

JA3 is a hash of five fields from the ClientHello — TLS version, cipher suite IDs, extension IDs, supported elliptic curves, and EC point formats — concatenated and MD5-hashed. Because browsers send these fields in a specific order and include browser-specific extensions, the resulting 32-character hex string acts like a browser signature at the network layer. Fraud-detection systems and CDNs use JA3 to tell human traffic from bots, and to detect when a user agent header has been spoofed but the underlying TLS stack hasn't.

Why does this page need its own backend?

JavaScript running in a browser cannot see the bytes of the TLS handshake its own browser sent — the handshake happens below the JavaScript layer, in the network stack. The only way to expose it is to have a server on the other end of the connection read the ClientHello and report it back. That's what the Go backend behind this page does: it terminates TLS directly (no CDN, no reverse proxy that would re-terminate and hide your real ClientHello) and replays the raw handshake bytes to you over the same connection.

Is ALPN the same as HTTP version?

Almost. ALPN (Application-Layer Protocol Negotiation) is how the client and server agree, during the TLS handshake, which protocol to speak after TLS completes. 'h2' means HTTP/2, 'http/1.1' means HTTP/1.1, and 'h3' would mean HTTP/3 over QUIC (though HTTP/3 doesn't use TLS-over-TCP, so you'll never see h3 on this page). Seeing 'h2' in the list means your browser is willing to speak HTTP/2; the final value at the top of the report is what we actually negotiated.

Why is the handshake version TLS 1.2 when I see TLS 1.3 elsewhere?

Backwards compatibility. The ClientHello's top-level 'legacy version' field was frozen at TLS 1.2 to get past middleboxes that would reject anything newer. The real supported versions are carried in a separate extension called 'supported_versions', which you'll see listed in the ClientHello Summary section. If TLS 1.3 appears there and also as the negotiated version at the top, your connection is TLS 1.3.

Can I change my JA3 fingerprint?

Not easily. Every major browser (Chromium, Firefox, Safari) has its own TLS stack — BoringSSL, NSS, and Secure Transport/Network.framework respectively — and they each emit a fixed set of cipher suites and extensions in a fixed order. The main ways to change your JA3 are to change browsers, change OS (which changes the TLS library on Safari), or use a TLS-impersonating tool like curl-impersonate. Browser privacy extensions cannot change JA3 because they run above the TLS layer.

More Tools

Further Reading