Looking for echtool, our tool to perform customized ECH handshakes? Open echtool →

Measurement Method

This public measurement service is based on a method presented at ACM IMC 2026. In contrast to the original paper, we probe only from a single vantage point and use a different input list of target domain names.

Overview

We measure ECH deployment of domains on the latest CrUX top million list once per week from a single vantage point.

We first explain how ECH works and how we use its retry mechanism to measure ECH, then detail the measurement setup:

  1. How ECH Works
  2. Measurement Idea
  3. How the Measurement Works
  4. Which Domains Are Probed?
  5. Aggregation of Public Names
  6. Paper
ScheduleWeekly
TargetsCrUX top million
Vantage pointTU Dresden (IPv4 only)

How ECH Works

ECH is standardized in RFC 9849. Normally, a client learns how to use ECH from DNS. Before it connects, it queries the HTTPS resource record (RR) of the name it wants to visit. Its ech parameter carries the server's ECH configuration: a public key and a public name. The client then encrypts its real ClientHello under that key, and an observer sees only the public name.

Common ECH: the client queries DNS for the HTTPS resource record, which carries the ECH configuration, may cache it, and sends a ClientHello whose ECH extension holds the encrypted inner ClientHello. Then the server rotates its key; a later connection under the cached old key is answered with the new configuration in retry_configs, and the client retries with it. Client DNS resolver/Nameserver example.com generating key… retiring old key updating key A later connection, with the cached configuration Retry, with the configuration from retry_configs 1 DNS queryexample.com, type HTTPS 2 DNS answerHTTPS RR ech:public name public.com public.com 3 ClientHelloSNI: public.com ECH: SNI example.com 4 ServerHello, …, EncryptedExtensions ✓ ECH accepted 5 HTTPS RR update ech: 6 ClientHelloSNI: public.com ECH: SNI example.com 7 ServerHello, …, EncryptedExtensions retry_configs:public name public.com public.com 8 ClientHelloSNI: public.com ECH: SNI example.com 9 ServerHello, …, EncryptedExtensions ✓ ECH accepted

Common ECH. The configuration comes from the HTTPS RR in DNS (1, 2); the handshake with ECH follows (3, 4). Then the server rotates its key (5), and a client that still caches the old one recovers with the retry configuration (6 to 9).

Measurement Idea

Servers rotate their ECH keys, and clients may still hold an outdated configuration, for example from a DNS cache. ECH has a recovery path for this: a server that cannot decrypt the ECH extension answers with its current configuration, the retry configuration, and the client tries again with it.

Our method uses exactly this recovery path, and so does not rely on DNS. In place of an outdated key, we send an ECH extension under a random key, which no server can decrypt. A standard-compliant ECH server answers it as it would answer a client after a key rotation: with its retry configuration. We then use that configuration in a second connection to test whether ECH actually works.

example.com without ECH

Probe of example.com without ECH: a ClientHello with an ECH extension under a random key, an ordinary reply without retry configuration, and no second connection. Scanner example.com 3 No retry configuration, so no second connection 1 ClientHelloSNI: example.com ECH: under a random key 2 ServerHello, …, EncryptedExtensions – no retry_configs: ECH extension ignored

Result: No ECH

example.com with ECH

Probe of example.com with ECH: a ClientHello with an ECH extension under a random key, the retry configuration in reply, and a second connection that uses it, which the server accepts or rejects. Scanner example.com Second connection, with the retry configuration 1 ClientHelloSNI: example.com ECH: under a random key 2 ServerHello, …, EncryptedExtensions retry_configs:public name public.com 3 ClientHelloSNI: public.com ECH: SNI example.com 4 ServerHello, …, EncryptedExtensions ✓ ECH accepted: inner hello decrypted ! or ECH rejected: e.g. key rotated

Result: ECH accepted or ECH rejected

We send example.com an ECH extension under a random key, shown for both cases: example.com without ECH, left, and with ECH, right. Only with ECH does it answer with a retry configuration, and a second connection with it tests whether ECH actually works.

How the Measurement Works

1. Capturing DNS entries. Every name is queried for its HTTPS resource record. A record may carry an ech parameter holding one or more ECH configurations: the public key and public name a client needs to encrypt its ClientHello before it ever talks to the server. Each configuration found is decoded, so the site knows not just that a name announced ECH but also which key, config id and cipher suites.

Setup of the DNS Measurement

Every name on the list is queried for its HTTPS resource record with zdns. An HTTPS record can carry an ech parameter with one or more ECH configurations. Each configuration holds the public key and the public name a client needs to encrypt its ClientHello. We decode every configuration with echtool, so the dataset records the config id, the public name and the cipher suites, not only that a configuration was present.

A name counts as ECH in DNS when any answer in its HTTPS record carried an ECH configuration.

2. Measuring web server behavior. This step consists of two separate measurements: every name is probed once over TCP with HTTP/2 and once over QUIC with HTTP/3. Each probe offers a generated ECH extension that the server cannot decrypt. If the server supports ECH, it must return its current ECH configuration in retry_configs. We then probe again with this ECH configuration. We group results into:

StatusMeaning
ECH accepted The handshake completed with the encrypted ClientHello, using the configuration the server provided. The server supports ECH.
ECH rejected The server supports ECH and returned retry configurations, but did not accept the second connection that used them. This can happen, e.g., after a key rotation.
No ECH The connection worked without ECH, or the server ignored the ECH extension. The server does not support ECH.
Probe failed Covers several kinds of errors, e.g., name resolution failures and timeouts. This is a finding about the path, not about ECH.
Setup of the TCP and QUIC Measurements

Every name is then probed twice with a zgrab2-based scanner: over TCP with HTTP/2 and over QUIC with HTTP/3. The probe sends a GREASE ECH extension, an ECH request the server cannot decrypt. A server that implements ECH according to the standard cannot decrypt it, so it completes the handshake with the outer ClientHello and returns its current ECH configuration in retry_configs inside its EncryptedExtensions. This finds servers that support ECH even when they do not publish a configuration in DNS.

We join the three measurements into one view based on the domains actively probed.

Which Domains Are Probed?

We measure the Chrome UX Report (CrUX) top million list, taken from the crux-top-lists repository. Each measurement uses the most recent list that was published before the measurement started.

CrUX ranks the origins that browsers actually visit. It therefore contains www.example.com far more often than example.com. This is why the site reports both queried names and the registrable domains (second-level domains) behind them.

In contrast, the paper aggregates entries from multiple toplists.

Aggregation of Public Names

The ranking by ECH public name counts, for each public name, the domains that completed an ECH handshake under it. A domain configured under more than one public name is counted under each, so the bars can add up to more than the total. Some providers give every domain its own random public name below a common domain, for example ab12cd34.example.com. These are combined into one entry, *.example.com, in the ranking. The stored measurements keep the original names.

This service builds on our paper:

Discovering Encrypted Client Hello Deployments by Active ECH Probing

Jonas Mücke, Konstantin Gasser, Thomas C. Schmidt, Matthias Wählisch

Abstract. We present a new measurement method to detect ECH deployments. This method leverages standard-compliant behavior of ECH servers. Prior measurements relied on DNS exposure and reported only one major ECH deployment (Cloudflare). Our measurements reveal yet undiscovered ECH deployments, including a large deployment at Meta. Meta servers support ECH, but ECH configuration is not exposed via the DNS. We also empirically study details such as the level of privacy improvement and latency impact of ECH.

If you use data or tools, please cite our paper:

Jonas Mücke, Konstantin Gasser, Thomas C. Schmidt, and Matthias Wählisch. 2026. Discovering Encrypted Client Hello Deployments by Active ECH Probing. In Proceedings of the 2026 ACM Internet Measurement Conference (IMC '26). ACM, New York, NY, USA, 276–286. https://doi.org/10.1145/3777912.3839832

Full paper