ECH の config を well-known URI で配布するドラフトのメモ
Encrypted Client Hello (ECH) の設定の課題
現状 Chrome などで実装が進んでいるECHは、サーバーが生成した ECH 用の公開鍵を DNS のHTTPS resource record の値の ECHConfigList に設定していることが前提になっている。
この DNS の resource record に依存するやり方は、サーバーの管理者が ECH 用の鍵ペアを更新する際に
- サーバー管理者の管轄外の DNS に resource record が登録されている可能性がある
 - 鍵の更新時に resource record の値を自動的に書き換える API が DNS プロバイダーから提供されているとは限らない
 
という課題があった。
well-known URI と zone factory
このような背景があり提案された draft が A well-known URI for publishing ECHConfigList values. だ。
この draft では
- サーバー管理者が well-known URI で ECHConfigList の値を配布する
 - DNS の resource record への書き込み権限を持つ存在が、https クライアントとして well-known URI から ECHConfigList の値を取得し、DNS の HTTPS resource record に書き込む
- (draft ではこのような存在を zone factory と呼称している)
 
 
という仕組みでサーバー側の鍵更新と DNS の resource record の更新を同期させることを提案している。
draft に明記はされていないが、おそらく zone factory は各種 DNS プロバイダーがデプロイすることになるだろう。
well-known URI で ECHConfigList の値を配布する
サーバーは zone factory 向けに https://{HOSTNAME}/.well-known/origin-svcb に JSON コンテンツを置く。この JSON には以下のような情報を含める
- SVCB record の AliasMode と等価の設定
 - SvcPriority に対応する設定
 - TargetName に対応する設定
 - SvcParamKey の port に対応する設定
 - ECHConfigList を 含む base64 encoded な文字列。SvcParamKey の ech に対応する設定
 
JSON content のフォーマットは現在議論中であり、draft-00 から draft-01 でも大きく変わったため、今後も変更される可能性が大いにある。
AliasMode 相当
AliasMode を利用するときの JSON コンテンツの例はこのようになる。
// https://foo.example.com/.well-known/origin-svcb
{
  "alias": "foo.example.com:443"
}
ServiceMode 相当
AliasMode を用いずに、ServiceMode に対応する設定はこのようになる。
// https://foo.example.com/.well-known/origin-svcb
{
  "endpoints": [
    {
      "priority": 1,
      "target": "foo.example.com",
      "ech": "Zm9vYmFy.....aG9nZQ=="
    },
    {
      "priority": 1,
      "port": 8443,
      "ech": "Zm9vYmFy.....aG9nZQ=="
    },
    {}
  ]
}
空の endpoint ({}) は、
- SvcPriority が 未設定 (推論に任せる)であり
 - TargetName が 
.であり - ECH を サポートしていない
 
HTTPS resource record に対応する。これは HSTS を利用する方法の 1 つになる。
zone factory の挙動
zone factory は /.well-known/origin-svcb から JSON を fetch したら、DNS の resource record を設定し公開する前に、提示された endpoint が動作していて Origin にアクセス可能であることをテストする。
また、 zone factory は GREASEd ECH を送信して、返ってきた retry-config と ECHConfig 値の整合性を確認することができる。
/.well-known/origin-svcb の freshness と DNS の TTL
サーバー管理者が/.well-known/origin-svcbに配置する JSON を、例えば cache-control: max-age=3600 で配布しているとする。これは ECH の設定が最短 1h で更新されうることを意味する。そのため、zone facttory はこの JSON の freshness time を考慮して十分短い時間で DNS の resource record の TTL を設定する必要がある。
参考資料
- TLS Encrypted Client Hello
 - Service binding and parameter specification via the DNS (DNS SVCB and HTTPS RRs)
 - A well-known URI for publishing ECHConfigList values.