HTTPSの接続情報を通知する "HTTPS DNSレコード" の提案仕様

HTTPSで通信を開始する際に、事前に知っていると有用な情報が幾つかあります。

  • サーバがHTTP/3に対応しているか(Alt-Svc情報)
  • TLS Encrypted Client Hello で必要な情報
  • サーバがHSTSを要求してくるか

このような情報を提供する新しいDNSレコードを定義する仕様が提案されています。提案仕様「Service binding and parameter specification via the DNS (DNS SVCB and HTTPS RRs)」では、サービスに関する情報を通知する一般形式であるSVCBレコードと、HTTPS用であるHTTPSレコードを定義しています。

もともとはHTTPSSVCレコードという名称でしたが、最近改称されHTTPSレコードになりました。

また、このHTTPSレコードを用いることでANAMEレコードが解決しようとしていた、APEXを別のレコードに飛ばすことも可能です。

簡単に紹介していきます。

実装状況

Chromeがすでに実装を開始しています

また、CloudFlareではすでに、このHTTPSレコードを返すようになっています (レコードタイプ 65)。下記はうまくデコード出来てませんが、HTTP3のドラフト版対応を通知してます。

$ dig  blog.cloudflare.com type65 +short
;; ANSWER SECTION:
blog.cloudflare.com.    294     IN      TYPE65  \# 76 000100000100150568332D32390568332D32380568332D3237026832 0004000868121A2E68121B2E00060020260647000000000000000000 68121A2E26064700000000000000000068121B2E

概略

HTTPSは下記のような形式をしています。

Name TTL IN HTTPS SvcPriority TargetName SvcParams

具体例を見ていきましょう

   pool  7200 IN HTTPS 1 h3pool alpn=h2,h3 port="443" echconfig="123..."
                 HTTPS 2 .      alpn=h2 echconfig="abc..."

   pool   300 IN A        192.0.2.2
                 AAAA     2001:db8::2
   h3pool 300 IN A        192.0.2.3
                 AAAA     2001:db8::3

HTTPSレコードの中身の最初の値は優先度で、異なる優先度でHTTP/3用とHTTP/2用のレコードがあります。

1つ目のHTTPSレコードは、TargetNameとしてh3poolという指定してきます。このe3poolのエンドポイントが、poolサブドメインalternative endpointとして動作させる事ができます (RFC7838 HTTP Alternative Services 参照)

SvcParamsとして、使用するポート番号、HTTP/2やHTTP/3に対応していることを示すalpnの識別子、TLS Encrypted Client Helloの情報を付加しています。

また、HTTPSレコードを使用しているだけで、このドメインに対してHTTP Strict Transport Security(HSTS)が適応されます。