DNS over HTTPS(DoH)用の JSON API

これまで、ウェブベースのアプリケーションでは、DANEDNS-SD サービス ディスカバリなどの高度な DNS 機能を使用したり、IP アドレス以外のもの(MX レコードなど)を解決したりするために、ブラウザ拡張機能が必要でした。SSHFP レコードなどの DNSSEC 依存機能を使用するには、ブラウザや OS では検証しない可能性があるため、このような拡張機能で DNSSEC 自体を検証する必要があります。

2016 年から、Google Public DNS は、DNSSEC 検証に対応したウェブ フレンドリーな DoH 用 API を提供しています。この API は、ブラウザや OS の構成、拡張機能を必要としません。シンプルな GET クエリ パラメータと JSON レスポンスにより、クライアントは一般的なウェブ API を使用して結果を解析でき、ドメイン名のポインタ圧縮のような複雑な DNS メッセージ形式の詳細を使用する必要がなくなります。

HTTP ヘッダー、リダイレクト処理、プライバシーに関するおすすめの方法、HTTP ステータス コードなど、DoH の一般的な情報については、一般的な DoH ドキュメントのページをご覧ください。

セキュア トランスポートのページには、DoH 用の curl コマンドラインの例と、TLS サポートや DNS 切り捨てなど、DoH と DNS over TLS(DoT)に共通する情報が記載されています。

JSON API の仕様

すべての API 呼び出しは HTTP GET リクエストです。パラメータが重複している場合は、最初の値のみが使用されます。

サポートされるパラメータ

name

文字列(必須)

唯一の必須パラメータ。RFC 4343 バックスラッシュ エスケープは許容されます。

  • バックスラッシュ エスケープの置き換え後の長さは、1 ~253 にする必要があります(末尾のドットがあれば省略できます)。
  • すべてのラベル(名前のドット間の部分)は 1 ~ 63 バイトでなければなりません。
  • .example.comexample..com のような無効な名前、または空の文字列の場合、400 Bad Request が返されます。
  • 非 ASCII 文字はプニーコードする必要があります(ελ ではなく xn--qxam)。
type

文字列、デフォルト: 1

RR タイプは、[1, 65535] の数値または正規文字列(Aaaaa など、大文字と小文字を区別しない)で表します。「ANY」クエリに 255 を使用できますが、A と AAAA または MX レコードの両方のクエリを送信するための代替ではないことに注意してください。権威ネームサーバーは、このようなクエリに対してすべてのレコードを返す必要はありません。応答しないものと、HINFO のみを返すもの(cloudflare.com など)があります。

cd

ブール値、デフォルト: false

CD(チェック無効)フラグ。 DNSSEC 検証を無効にするには、cd=1 または cd=true を使用します。DNSSEC 検証を有効にするには、cd=0cd=false、または cd パラメータなしを使用します。

文字列、デフォルト: 空

目的のコンテンツ タイプのオプション。 ct=application/dns-message を使用して、JSON テキストではなくバイナリ DNS メッセージをレスポンス HTTP 本文で受け取ります。ct=application/x-javascript を使用して JSON テキストを明示的にリクエストします。他のコンテンツ タイプの値は無視され、デフォルトの JSON コンテンツが返されます。

do

ブール値、デフォルト: false

DO(DNSSEC OK)フラグ。DNSSEC レコード(RRSIG、NSEC、NSEC3)を含めるには、do=1 または do=true を使用します。DNSSEC レコードを省略するには、do=0do=false、または do パラメータなしを使用します。

他の実装には常に JSON レスポンスが含まれている可能性があるため、アプリケーションは JSON レスポンス内の DNSSEC レコードを常に処理し、必要に応じて無視する必要があります。また、JSON レスポンスのデフォルトの動作は今後変更される可能性があります。(バイナリ DNS メッセージ レスポンスでは、常に DO フラグの値が優先されます)。

edns_client_subnet

文字列、デフォルト: 空

edns0-client-subnet オプション。形式は、IP アドレスとサブネット マスクです。例: 1.2.3.4/242001:700:300::/48

プライバシーに関する懸念から DNS-over-HTTPS を使用していて、位置情報の精度を高めるために IP アドレスの一部を権威ネームサーバーに送信したくない場合は、edns_client_subnet=0.0.0.0/0 を使用します。Google Public DNS は通常、おおよそのネットワーク情報を送信します(通常は IPv4 アドレスの最後の部分をゼロにします)。

random_padding

文字列、無視

このパラメータの値は無視されます。(例: XmkMw~o_mgP2pf.gpw-Oi5dK)。

HTTPS GET リクエストのパケットサイズを使用したサイドチャネル プライバシー攻撃の可能性を懸念している API クライアントは、この機能を使用して、リクエストにランダムデータをパディングすることで、すべてのリクエストをまったく同じサイズにできます。URL の誤った解釈を防ぐため、パディング文字を予約されていない URL 文字(大文字と小文字、数字、ハイフン、ピリオド、アンダースコア、チルダ)に限定してください。

JSON 形式の DNS レスポンス

正常なレスポンス(ここに追加されたコメントは、実際のレスポンスには存在しません):

{
  "Status": 0,  // NOERROR - Standard DNS response code (32 bit integer).
  "TC": false,  // Whether the response is truncated
  "RD": true,   // Always true for Google Public DNS
  "RA": true,   // Always true for Google Public DNS
  "AD": false,  // Whether all response data was validated with DNSSEC
  "CD": false,  // Whether the client asked to disable DNSSEC
  "Question":
  [
    {
      "name": "apple.com.",  // FQDN with trailing dot
      "type": 1              // A - Standard DNS RR type
    }
  ],
  "Answer":
  [
    {
      "name": "apple.com.",   // Always matches name in the Question section
      "type": 1,              // A - Standard DNS RR type
      "TTL": 3599,            // Record's time-to-live in seconds
      "data": "17.178.96.59"  // Data for A - IP address as text
    },
    {
      "name": "apple.com.",
      "type": 1,
      "TTL": 3599,
      "data": "17.172.224.47"
    },
    {
      "name": "apple.com.",
      "type": 1,
      "TTL": 3599,
      "data": "17.142.160.59"
    }
  ],
  "edns_client_subnet": "12.34.56.78/0"  // IP address / scope prefix-length
}

「scopePrefix-length」とキャッシュに対する影響の詳細については、RFC 7871(EDNS クライアント サブネット)をご覧ください。

診断情報を含む失敗レスポンス:

{
  "Status": 2,  // SERVFAIL - Standard DNS response code (32 bit integer).
  "TC": false,  // Whether the response is truncated
  "RD": true,   // Always true for Google Public DNS
  "RA": true,   // Always true for Google Public DNS
  "AD": false,  // Whether all response data was validated with DNSSEC
  "CD": false,  // Whether the client asked to disable DNSSEC
  "Question":
  [
    {
      "name": "dnssec-failed.org.",  // FQDN with trailing dot
      "type": 1                      // A - Standard DNS RR type
    }
  ],
  "Comment": "DNSSEC validation failure. Please check http://dnsviz.net/d/dnssec-failed.org/dnssec/."
}

引用符とネームサーバー アトリビューションを含む SPF レコードと TXT レコード:

{
  "Status": 0,  // NOERROR - Standard DNS response code (32 bit integer).
  "TC": false,  // Whether the response is truncated
  "RD": true,   // Always true for Google Public DNS
  "RA": true,   // Always true for Google Public DNS
  "AD": false,  // Whether all response data was validated with DNSSEC
  "CD": false,  // Whether the client asked to disable DNSSEC
  "Question": [
    {
      "name": "*.dns-example.info.",  // FQDN with trailing dot
      "type": 99                      // SPF - Standard DNS RR type
    }
  ],
  "Answer": [
    {
      "name": "*.dns-example.info.",   // Always matches name in Question
      "type": 99,                      // SPF - Standard DNS RR type
      "TTL": 21599,                    // Record's time-to-live in seconds
      "data": "\"v=spf1 -all\""        // Data for SPF - quoted string
    }
  ],
  "Comment": "Response from 216.239.38.110"
  // Uncached responses are attributed to the authoritative name server
}

{
  "Status": 0,  // NOERROR - Standard DNS response code (32 bit integer).
  "TC": false,  // Whether the response is truncated
  "RD": true,   // Always true for Google Public DNS
  "RA": true,   // Always true for Google Public DNS
  "AD": false,  // Whether all response data was validated with DNSSEC
  "CD": false,  // Whether the client asked to disable DNSSEC
  "Question": [
    {
      "name": "s1024._domainkey.yahoo.com.", // FQDN with trailing dot
      "type": 16                             // TXT - Standard DNS RR type
    }
  ],
  "Answer": [
    {
      "name": "s1024._domainkey.yahoo.com.", // Always matches Question name
      "type": 16,                            // TXT - Standard DNS RR type
      "data": "\"k=rsa;  p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDrEee0Ri4Juz+QfiWYui/E9UGSXau/2P8LjnTD8V4Unn+2FAZVGE3kL23bzeoULYv4PeleB3gfm\"\"JiDJOKU3Ns5L4KJAUUHjFwDebt0NP+sBK0VKeTATL2Yr/S3bT/xhy+1xtj4RkdV7fVxTn56Lb4udUnwuxK4V5b5PdOKj/+XcwIDAQAB; n=A 1024 bit key;\""
      // Data for TXT - multiple quoted strings
    }
  ],
}

DNS 文字列

すべての TXT レコードは、RFC 4408(SPF)RFC 4871(DKIM)などのより長い TXT レコード形式の使用も含め、単一の JSON 文字列としてエンコードされます。

EDNS

一般的な EDNS 拡張メカニズムはサポートされていません。EDNS クライアント サブネット オプション(edns-client-subnet)は GET リクエストのパラメータであり、JSON レスポンスの最上位フィールドです。