HTTPS over HTTPS(DoH)用の JSON API

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

2016 年以降、Google Public DNS は DNSSEC 検証を使用した DoH 向けのウェブ フレンドリー 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 レコードの両方にクエリを送信する代わりにないことに注意してください。権威ネームサーバーは、このようなクエリのためにすべてのレコードを返す必要はありません。応答しないサーバーもあれば、cloudflare.com などのアプリが HINFO のみを返すものもあります。

cd

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

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

文字列、デフォルト: 空

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

do

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

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

他の実装には常に DNSSEC レコードが格納されている可能性があるため、アプリケーションは常に 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 アドレスの最後の部分はゼロになります)。

ランダム パディング

文字列、無視

このパラメータの値は無視されます。(例: 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
}

「スコープの接頭辞長」とキャッシュへの影響の詳細については、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 レコード形式の使用を含む、1 つの JSON 文字列としてエンコードされます。

EDNS

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