20181020更新
RFC8484として標準化されました
「DNS Queries over HTTPS」の仕様の標準化が始まっている。
今までもこのテーマはIETFにおいて何度か議論になってきましたが、今回 DNS Over HTTPS (doh) WGの設立に合わせて(まだProposed)、この「DNS Queries over HTTPS」の標準化がマイルストーンとなっている。
今回の「DNS Queries over HTTPS」は、Googleの提供しているDNS over HTTPSとは全然違う仕様である点は注意が必要です。GoogleのものはクエリとレスポンスをJson形式で構造化するが、今回は比較的素のDNSクエリをHTTPSで送り合う仕様である(今後JSON形式をサポートする可能性はあります)。
このプロトコルではHTTP/2を使う必要があります(MUST)。HTTP/2を使うことで、既存のWebサーバとのコネクション上でDNSレコードをサーバプッシュで送る事も出来ます。
DNS Queries over HTTPS
背景
たとえば、接続しているネットワークが外のDNSとの通信を許可するとは限りません。
公衆Wi-Fiなどのネットワーク提供者がネットワーク内のDNSとの接続のみを許可していたり、もしくはなりすましされて、DNS通信が偽装される可能性もあります。そのようなネットワークでも安全にDNSとやり取りするために、HTTPS上でDNSクエリを送る方法が今回の「「DNS Queries over HTTPS」」という仕様になります。
HTTPリクエスト
GET及びPOSTをサポートします。GETの場合はGETパラメータに、POSTの場合はHTTPボディにDNSクエリが格納されます。
www.example.comのAレコードを問い合わせる場合は
GETの場合
:method = GET :scheme = https :authority = dnsserver.example.net :path = /.well-known/dns-query? (no CR) content-type=application/dns-udpwireformat& (no CR) body=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB accept = application/dns-udpwireformat, application/simpledns+json
POSTの場合
:method = POST :scheme = https :authority = dnsserver.example.net :path = /.well-known/dns-query accept = application/dns-udpwireformat, application/simpledns+json content-type = application/dns-udpwireformat content-length = 33 <33 bytes represented by the following hex encoding> abcd 0100 0001 0000 0000 0000 0377 7777 0765 7861 6d70 6c65 0363 6f6d 0000 0100 01
HTTPレスポンス
HTTPレスポンスボディにDNSレスポンスが格納されます。max-ageにDNSのTTLと同じ値を格納すべきです。また、304ステータスコードやLast-Modifiedヘッダ、Etagヘッダは仕様すべきではありません。
www.example.comの問い合わせに、93.184.216.34 (TTL=128)を帰す場合は
:status = 200 content-type = application/dns-udpwireformat content-length = 64 cache-control = max-age=128 <64 bytes represented by the following hex encoding> abcd 8180 0001 0001 0000 0000 0377 7777 0765 7861 6d70 6c65 0363 6f6d 0000 0100 0103 7777 7707 6578 616d 706c 6503 636f 6d00 0001 0001 0000 0080 0004 5db8 d822