# How to Test Whether ECH Is Actually Protecting You

> Markdown version of an Informer Tech article. Canonical HTML page: https://www.informertech.com/post/how-to-test-encrypted-client-hello-ech
> Source: Informer Tech, https://www.informertech.com/

- **Canonical URL:** https://www.informertech.com/post/how-to-test-encrypted-client-hello-ech
- **Publisher:** Informer Tech (https://www.informertech.com/)
- **Category:** Internet & Protocols, Network Security
- **Author:** Carlos Dusan
- **Published:** 2026-10-28
- **Description:** Learn how to test if Encrypted Client Hello (ECH) is actually hiding your SNI. Verify DNS HTTPS records, run trace checks, and spot silent TLS downgrades.

---

Encrypted Client Hello is easy to turn on and easy to misread. A green padlock, a browser flag, or a site that "supports ECH" does not prove this visit hid its name. This test separates three outcomes. The client never offered ECH. The server rejected it. Or the handshake accepted it and the real name stayed inside.

## What "protecting you" means on the wire

ECH is a TLS 1.3 extension, published as [RFC 9849](https://www.rfc-editor.org/info/rfc9849), that encrypts the sensitive parts of the first client message. The ClientHello splits in two. The outer hello is visible and carries a public name. The inner hello carries the real server name, encrypted to a key the client-facing server published in advance.

On Cloudflare that public name is <code>cloudflare-ech.com</code>. An observer can tell you reached some ECH site on that network. They cannot tell which one from the handshake alone, as [Cloudflare's ECH docs](https://developers.cloudflare.com/ssl/edge-certificates/ech) describe. Picture a hotel key card. The clerk sees you entered the hotel. The card does not print your room number for the lobby to read.

That protection is narrow. [RFC 9849](https://www.rfc-editor.org/info/rfc9849) still leaves the destination IP visible, and a DNS lookup made in the clear still names the site. ECH is aimed at a passive network observer, not at the TLS terminator. Cloudflare and the site owner still learn the name, which the [Cloudflare announcement](https://blog.cloudflare.com/announcing-encrypted-client-hello) states outright.

## Set up a client that can use ECH at all

Three things have to be true before a test means anything. The client must speak TLS 1.3. It must receive an HTTPS or SVCB record that still contains the <code>ech</code> parameter. And that lookup should travel over encrypted DNS, so a local resolver cannot strip the parameter and leave you with a normal hello. [RFC 9849](https://www.rfc-editor.org/info/rfc9849) treats that stripped record as a downgrade.

Firefox and Chromium-family browsers offer ECH when encrypted DNS is active and the site published a key. Safari has little or no user-facing control, according to this [2026 ECH setup guide](https://packet.guru/blog/ECH-Encrypted-Client-Hello-2026). A network can also disable the feature without touching the site. An empty or NXDOMAIN answer to HTTPS queries stops Chrome. The same answer for <code>use-application-dns.net</code> stops Firefox, which [Cloudflare documents](https://developers.cloudflare.com/ssl/edge-certificates/ech) as a canary.

## Confirm the site published an ECH configuration

Look up the HTTPS record for the exact name you will open. You need an <code>ech</code> parameter. Without it, this name cannot be protected, whatever the browser settings say. [RFC 9849](https://www.rfc-editor.org/info/rfc9849) makes publication of that configuration a prerequisite, and the [packet.guru guide](https://packet.guru/blog/ECH-Encrypted-Client-Hello-2026) shows how to inspect the record.

A published key is necessary, not sufficient. It can be stale, stripped on your path, or ignored after the server rejects ECH. Use a known Cloudflare proxied name as the positive control. Free zones have ECH on by default, and other plans can turn it off in Edge Certificates, per [Cloudflare's docs](https://developers.cloudflare.com/ssl/edge-certificates/ech).

## Read the handshake you just completed

Open <code>https://www.cloudflare.com/cdn-cgi/trace</code>, swapping in the domain under test, and read the <code>sni=</code> line. <code>sni=encrypted</code> means that completed handshake encrypted the server name. A plaintext name means it did not. Cloudflare documented this trace check in its [encrypt-that-SNI write-up](https://blog.cloudflare.com/encrypt-that-sni-firefox-edition). Hard-refresh or force a new connection first. A reused session can show an old result.

If you capture packets, pass only when the ClientHello has the <code>encrypted_client_hello</code> extension and the visible SNI is the public name, not the name you typed. Ignore GREASE. A fake ECH extension sent when the server never advertised a key is not protection, as the [setup guide](https://packet.guru/blog/ECH-Encrypted-Client-Hello-2026) notes.

![](https://studio.informertech.com/assets/35df8911-8b1e-4681-994b-f1b67cb0dec8.jpg?width=1280&height=720)

## Separate a cover name from real privacy

A pass on SNI can still leak the name through the destination IP. If that address hosts only one site, an observer does not need the ClientHello. [RFC 9849](https://www.rfc-editor.org/info/rfc9849) says this directly. Shared hosting and a large anonymity set are what make the cover name useful.

Certificate Transparency can still publish the name. ECH does not pull a certificate out of public logs, which the [packet.guru guide](https://packet.guru/blog/ECH-Encrypted-Client-Hello-2026) flags as a separate leak. And the client-facing server still decrypts the inner hello. You have hidden the name from intermediaries, not from the service that terminates TLS.

## Failure modes that fake a pass

A page that loads is not evidence. If something tampers with DNS and drops <code>ech</code>, the browser falls back to a clear ClientHello and the site still opens. [RFC 9849](https://www.rfc-editor.org/info/rfc9849) treats that as a downgrade, not as a protected visit.

Rejection is stricter than fallback. When ECH is rejected, that connection must not carry application data. A later retry without ECH can leak the name after the first attempt failed. A middlebox that blocks unknown TLS extensions can force the same path. Compare the site on a clean resolver and on the network you actually use before you trust a single result.

## A verdict you can defend

To test whether ECH is actually protecting you, require all three parts. The HTTPS record still has <code>ech</code>. This handshake shows <code>sni=encrypted</code> or a public-name outer SNI, not the name you typed. And you have either closed or accepted the remaining leaks: destination IP, clear DNS, and certificate logs. If any part fails, ECH is not protecting that visit, even when the feature is enabled.

## FAQ

**Does **<code>**sni=encrypted**</code>** mean every site I open is hidden?**

No. It describes that handshake. Repeat the check on the name you care about.

**Why does ECH fail on my office network but work at home?**

The resolver may be stripping HTTPS ECH data, or answering the Firefox canary so the browser never offers ECH, as [Cloudflare documents](https://developers.cloudflare.com/ssl/edge-certificates/ech).

**Is ECH the same as DNS over HTTPS?**

No. DoH hides the lookup. ECH hides the name in the TLS handshake. [RFC 9849](https://www.rfc-editor.org/info/rfc9849) needs both for the privacy claim.

**Can I tell from the address bar?**

No. The padlock does not say whether the ClientHello was encrypted.
