DNS over HTTPS(DoH)用の JSON API

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

Google Public DNS は 2016 年から、DNSSEC を使用した DoH 用のウェブ フレンドリーな API を提供しています。 ブラウザや OS の構成、拡張機能を必要としない検証が可能です。 単純な GET クエリ パラメータと JSON レスポンスを使用すると、 一般的なウェブ API を使用して処理し、複雑な DNS メッセージ形式 ドメイン名のポインタ圧縮

DoH の詳細については、一般的な DoH ドキュメント ページをご覧ください。 HTTP ヘッダー、リダイレクト処理、プライバシーのベスト プラクティス、 HTTP ステータス コード。

[Secure Transports] ページに DoH の curl コマンドラインの例、DoH と DNS over に共通する情報 TLS(DoT)のサポート、DNS 切り捨てなど。

JSON API 仕様

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

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

name

文字列、必須

唯一の必須パラメータ。RFC 4343 バックスラッシュ エスケープを使用できます。

  • 長さ(バックスラッシュ エスケープの置き換え後)は 1 ~ 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 を使用します。 cd=0cd=false、または cd パラメータなしを使用して DNSSEC 検証を有効にします。

文字列、デフォルト: 空

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

do

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

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

アプリケーションは常に 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

API クライアントは、 HTTPS GET リクエストのパケット サイズで、この値を使用して、 同じサイズにするためにリクエストをパディングします。 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 レコードの使用を含め、すべての TXT レコードは単一の JSON 文字列としてエンコードされます。 レコード形式 RFC 4408(SPF)または RFC 4871(DKIM)

EDNS

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