
SNI はなぜ見えていたのか ― TLS Encrypted ClientHello(ECH)と HTTPS の最後の平文
HTTPSなら、アクセス先も通信内容もすべて見えない。そう思いたくなりますが、長い間そうではありませんでした。ページ本文やCookie、フォーム内容は暗号化されても、TLSの最初に送られる SNI(Server Name Indication) は平文で残り、ネットワーク上の観測者に「どのドメインへ接続しようとしているか」を知らせていました。
その最後の大きな平文を隠すための仕組みが Encrypted ClientHello(ECH) です。2026年3月、ECHは RFC 9849 として標準化されました。本記事では、SNIがなぜ必要だったのか、TLS 1.3でも何が残っていたのか、ECHが何を暗号化し、逆に何を隠せないのかを整理します。
HTTPSでもドメイン名は見えていた
HTTPS は、ブラウザとサーバーの間の通信を TLS で暗号化します。TLS 1.3 では、サーバー証明書を含むハンドシェイクの多くも暗号化されるようになりました。しかし、接続の最初に送る ClientHello は、相手のサーバーと暗号鍵を合意する前に必要なメッセージです。その中に、接続したいホスト名を示す server_name 拡張、つまり SNI が含まれていました。
ClientHello
supported_versions: TLS 1.3
server_name: private.example.com # 従来はここが平文
alpn: h2, http/1.1
key_share: x25519...
SNI は、1つのIPアドレスで複数のHTTPSサイトを運用するために重要です。サーバーは SNI を見て、どの証明書を出すべきか、どの仮想ホストへルーティングすべきかを判断できます。つまり、SNI はプライバシー上は弱点ですが、Webホスティングの実務上は必要な情報でした。
TLS 1.3で隠れたもの、残ったもの
TLS 1.3 は TLS 1.2 以前に比べて、ハンドシェイクの秘匿性を大きく改善しました。特に、サーバー証明書が平文で流れなくなった点は大きな変化です。証明書にはドメイン名が含まれるため、TLS 1.2 では証明書を見るだけでも接続先を推測できました。
しかし、TLS 1.3 でも最初の ClientHello は暗号化前に送る必要があります。そこで SNI や ALPN など、接続先や利用プロトコルを推測できる情報が残りました。RFC 9849 は、平文SNIを「TLS 1.3で残った最も感度の高い情報」の一つとして位置づけ、ECHでこの問題に対処します。
| 情報 | TLS 1.2以前 | TLS 1.3 | ECHあり |
|---|---|---|---|
| HTTP本文 | 暗号化 | 暗号化 | 暗号化 |
| サーバー証明書 | 多くは平文 | 暗号化 | 暗号化 |
| SNI | 平文 | 平文 | ClientHelloInner内で暗号化 |
| 接続先IP | 見える | 見える | 見える |
ECHはClientHelloを二重構造にする
ECH の中心は、ClientHello を二重構造にする発想です。クライアントは、本当に接続したい名前や機密性の高い拡張を入れた ClientHelloInner を作り、それをサーバー側の公開鍵で暗号化します。そして、外から見えてもよい値を入れた ClientHelloOuter に、暗号化した Inner を載せて送ります。
ClientHelloOuter
server_name: public.example.com
encrypted_client_hello: Enc(ClientHelloInner)
ClientHelloInner
server_name: private.example.com
alpn: h2
key_share: ...
観測者から見ると、接続先は公開名 public.example.com に見えます。一方、ECHを復号できるクライアント向けサーバーは、暗号化された ClientHelloInner を取り出し、実際のバックエンドや証明書処理へ進めます。ここで重要なのは、ECHが「SNIだけを暗号化する」のではなく、ClientHelloの機密部分をまとめて隠す設計になっていることです。
ESNIからECHへ変わった理由
ECH の前身には ESNI(Encrypted SNI) がありました。名前の通り、ESNI は SNI だけを暗号化する方向で始まりました。しかし、実際の ClientHello には SNI 以外にも接続先や利用アプリケーションを推測できる情報があります。ALPN、PSK、拡張の組み合わせ、拡張の順序などが、観測者にヒントを与える可能性があります。
そのため、SNIだけを特別扱いで暗号化しても不十分です。RFC 9849 の ECH は、ClientHelloInner 全体を暗号化し、外側には匿名集合の中で揃えやすい情報を置く構造に変わりました。名称も ESNI から ECH へ変わったのは、保護対象が「server_name だけ」ではなくなったことを反映しています。
これは、プライバシー機能としてかなり大事な設計変更です。隠したい値を1個だけ暗号化しても、周辺のメタデータから同じことが推測できるなら意味が薄い。ECHはその反省を取り込んでいます。
ECHConfigはどこから来るのか
クライアントが ClientHelloInner を暗号化するには、サーバー側の公開鍵や対応方式を事前に知る必要があります。この設定情報が ECHConfig です。RFC 9849 は ECHConfig の構造を定義し、DNSでの配布方法は RFC 9848 が扱います。
現代のDNSには、HTTPSレコードやSVCBレコードという、サービス接続に必要な追加情報を渡す仕組みがあります。ECHでは、クライアントが名前解決の段階でHTTPS/SVCBレコードを取得し、その中の ech パラメータから ECHConfigList を得る流れが基本になります。
DNS HTTPS/SVCB record
svc priority / target name
alpn=h2,h3
ech=base64(ECHConfigList)
ここで注意したいのは、DNSが平文のままだと名前解決の段階で接続先が見えることです。ECHはTLSのClientHelloを守る仕組みであり、DNS問い合わせそのものを暗号化するわけではありません。そのため、DoH(DNS over HTTPS)、DoT(DNS over TLS)、DoQ(DNS over QUIC)などの暗号化DNSと組み合わせて初めて、観測点を大きく減らせます。
ECHで隠せるもの、隠せないもの
ECH は強力ですが、万能の匿名化技術ではありません。何を隠せて、何を隠せないかを分けて考える必要があります。
| 対象 | ECHの効果 |
|---|---|
| 本当のSNI | ClientHelloInner内で隠せる |
| ALPNなど一部のClientHello拡張 | Innerへ入れれば隠せる |
| DNS問い合わせ | ECH単体では隠せない |
| 接続先IPアドレス | 隠せない |
| 通信量・タイミング | 隠せない |
たとえば、専用IPに1つのサイトしか載っていない場合、SNIを隠してもIPアドレスから接続先を推測できます。一方、大きなCDNや共有ホスティングのように、同じIPや同じクライアント向けサーバーに多くのドメインが集まる環境では、ECHの効果が出やすくなります。
失敗時はどうなるのか
ECH は、失敗したら静かに平文SNIへ戻ればよい、という設計ではありません。RFC 9849 では、サーバーがECHを復号できない場合や設定が古い場合、クライアントはECHの受理・拒否を判定し、必要に応じて新しい設定で再試行します。ECHが拒否された接続は、そのままアプリケーションデータに使うものではない、という考え方です。
これはダウングレード攻撃への対策として重要です。もし攻撃者がECHをわざと失敗させ、ブラウザがそのまま平文SNIで接続し直すなら、ECHの保護は簡単に剥がされてしまいます。実装は、ECHを試した事実、サーバーからの応答、設定の更新を慎重に扱う必要があります。
同時に、互換性も課題になります。古いミドルボックス、企業ネットワークの監視装置、古いTLS終端、DNSのHTTPS/SVCB対応など、ECHはTLSだけでなく周辺の配信基盤にも影響します。
開発者・サイト運営者は何を見ればよいか
一般的なWebアプリ開発者が、ECHを自前で実装する場面はほとんどありません。多くの場合、ブラウザ、OS、CDN、DNS事業者、TLSライブラリ、リバースプロキシの対応に乗ることになります。ただし、仕組みを理解しておくと、セキュリティ説明やネットワーク設計で判断を間違えにくくなります。
- CDNやDNSプロバイダーが HTTPS/SVCB レコードとECHをどう扱うか確認する
- DoH/DoT/DoQなしではDNS問い合わせが観測されることを説明できるようにする
- 専用IPか共有CDNかで、ECHの匿名集合の大きさが変わることを理解する
- 企業ネットワークや監査環境では、ECHが可視化運用と衝突する可能性を把握する
- 「HTTPSならドメイン名も完全に見えない」と単純化して説明しない
また、ECHはポスト量子暗号とは別のテーマです。どちらもTLSの将来に関わりますが、ECHは接続先メタデータの秘匿、ML-KEMなどのポスト量子暗号は将来の計算能力に対する鍵交換・署名の耐性が主題です。
まとめ ― HTTPSのプライバシーは段階的に強くなっている
HTTPSは最初から完璧だったわけではありません。HTTP本文が暗号化され、TLS 1.3で証明書を含むハンドシェイクの多くが暗号化され、それでも残ったSNIという大きな平文に対して、ECHが標準化されました。
ECHは、ClientHelloInner を暗号化し、外側の ClientHelloOuter には公開名や互換性のための情報を置くことで、本当の接続先ドメインを観測者から見えにくくします。DNSのHTTPS/SVCBレコード、ECHConfig、DoH/DoT/DoQ、CDNの匿名集合が組み合わさって、はじめて効果が大きくなります。
一方で、IPアドレス、通信量、タイミング、平文DNS問い合わせまではECH単体では隠せません。だからこそ、ECHは「匿名化の魔法」ではなく、HTTPSのメタデータ漏れを一段減らす標準技術として理解するのが正確です。
参考文献・ソース
記事作成に関する注記
本記事は AI(大規模言語モデル)を編集補助として活用して作成しています。 公開前に編集者が内容を確認していますが、事実誤認・仕様の解釈ミス・最新情報との齟齬が含まれる可能性があります。 重要な判断を行う際は、本文中の一次ソースや公式ドキュメントを必ずご自身でご確認ください。 誤りにお気づきの場合は、お問い合わせフォームよりご連絡いただけると助かります。


