ECH は Encrypted Client Hello ↗ の略です。Transport Layer Security(TLS)におけるプロトコル拡張です。ECH はハンドシェイクの一部を暗号化し、TLS セッションの交渉に使う Server Name Indication(SNI)を隠します。つまり、ECH が有効な Cloudflare 上の Web サイトをユーザーが訪れると、経路上の第三者は Cloudflare 上の Web サイトへアクセスしていることは分かりますが、どのサイトかは特定できません。
ECH は、特定のユーザーがあなたの Web サイトを訪れているという情報へのアクセスを制限します。インターネットサービスプロバイダー(ISP)などの経路上の第三者へ、不要に共有されないようにします。ECH を使うと、ユーザーが Web サイトにアクセスするときに、訪問の具体的な詳細が経路上の第三者へ漏れなくなります。
通常の TLS ハンドシェイク ↗ では、クライアントは TLS セッションを開始するために ClientHello メッセージをサーバーへ送ります。このメッセージには、対応する暗号アルゴリズムの一覧、TLS バージョン、要求するサーバー名(接続先 Web サイトのドメイン名)など、重要な情報が含まれます。サーバー名は Server Name Indication(SNI)で示されます。
ECH では、ClientHello メッセージが内側と外側の 2 つに分かれます。外側には、使う暗号、TLS バージョン、outer ClientHello など、機微でない情報が入ります。内側は暗号化され、inner ClientHello を含みます。
outer ClientHello には、ユーザーが Cloudflare 上の暗号化された Web サイトを訪れようとしていることを表す共通名(SNI)が含まれます。Cloudflare 上の全 Web サイトが共有する SNI として cloudflare-ech.com を選んでいます。Cloudflare がそのドメインを管理しているため、そのサーバー名で TLS ハンドシェイクを交渉できる証明書があります。
inner ClientHello には、ユーザーが実際に訪れようとしているサーバー名が含まれます。これは公開鍵で暗号化され、読めるのは Cloudflare だけです。ハンドシェイクが完了すると、ほかの TLS 経由の Web サイトと同じように、通常どおりページが読み込まれます。
実際には、トラフィックを見ている経路上の第三者には、通常の TLS ハンドシェイクが見えます。ただし 1 点だけ異なります。Cloudflare 上の ECH 有効なサーバー名へのトラフィックは、どれも同じに見えます。すべての TLS ハンドシェイクが、実際の Web サイトではなく cloudflare-ech.com のサイトを読み込もうとしているように見えます。
次の例では、ユーザーが example.com を訪れています。ECH がないと、経路上のネットワークはユーザーがアクセスしている Web サイトを特定できます。ECH があると、見える情報は cloudflare-ech.com に限られます。
flowchart LR
accTitle: ECH の有無で経路上の第三者に見える情報
accDescr: ECH がある場合とない場合に、経路上の第三者に何が見えるかを示します。
A(ユーザーが <code>example.com</code> を訪問)
A -- ECH あり --> C(経路上の第三者には <code>cloudflare-ech.com</code> が見える)-->B(Cloudflare)
A -- ECH なし --> D(経路上の第三者には <code>example.com</code> が見える)-->B(Cloudflare)
ECH プロトコルの技術的な詳細は、紹介ブログ ↗ を参照してください。
Free ゾーンでは ECH はデフォルトで有効です。その他のプランでは、次の手順でオン / オフにできます。
-
Cloudflare ダッシュボードで、Edge Certificates ページを開きます。
Edge Certificates を開く ↗ -
Encrypted ClientHello (ECH) の設定を Enabled に変更します。
企業ネットワークや地域ネットワークでは、自ネットワークを通過するトラフィックを監査したり、フィルタリングポリシーを適用したりする必要がある場合があります。これらのポリシーは IP アドレスではなくドメイン名で表現します。そのため、個々のドメイン名に対する A および AAAA クエリへの応答として、ローカル DNS リゾルバーで適用するのが最適です。
ただし、DNS ベースのフィルタリングが使えない環境では、既存のフィルタリングをそのまま動かすために ECH を無効にする方法が 2 つあります。
最も確実な方法は、ローカルまたは再帰 DNS リゾルバー自体で行うことです。クライアントへ返す HTTPS リソースレコードから ECH 設定を取り除くか、より望ましい方法として、HTTPS クエリに対して “no error no answer” または NXDOMAIN を返します。これでクライアントは ECH に必要な情報を取得できません。HTTPS リソースレコードを改変すると、DNSSEC 検証を行うクライアントで失敗することがあるため、HTTPS 応答を破棄する方が望ましい場合があります。これにより、Chrome などのブラウザは ECH を使いません。
ECH を無効にする 2 つ目の方法は、ネットワークのカナリアドメインです。具体的には、ネットワークの DNS リゾルバーが use-application-dns.net の カナリアドメイン ↗ へのクエリに対して “no error no answer” または NXDOMAIN を返します。これにより、Firefox などのブラウザは ECH を使いません。詳細は、Firefox の Encrypted Client Hello に関する よくある質問 ↗ を参照してください。