これまで、ウェブベースのアプリケーションでは、DANE や DNS-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 バックスラッシュ エスケープは許容されます。
- type
文字列、デフォルト:
1
RR タイプは、[1, 65535] の数値または正規文字列(
A
やaaaa
など、大文字と小文字を区別しない)で表します。「ANY」クエリに255
を使用できますが、A と AAAA または MX レコードの両方のクエリを送信するための代替ではないことに注意してください。権威ネームサーバーは、このようなクエリに対してすべてのレコードを返す必要はありません。応答しないものと、HINFO のみを返すもの(cloudflare.com など)があります。- cd
ブール値、デフォルト:
false
CD(チェック無効)フラグ。 DNSSEC 検証を無効にするには、
cd=1
またはcd=true
を使用します。DNSSEC 検証を有効にするには、cd=0
、cd=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=0
、do=false
、またはdo
パラメータなしを使用します。他の実装には常に JSON レスポンスが含まれている可能性があるため、アプリケーションは JSON レスポンス内の DNSSEC レコードを常に処理し、必要に応じて無視する必要があります。また、JSON レスポンスのデフォルトの動作は今後変更される可能性があります。(バイナリ DNS メッセージ レスポンスでは、常に DO フラグの値が優先されます)。
- edns_client_subnet
文字列、デフォルト: 空
edns0-client-subnet オプション。形式は、IP アドレスとサブネット マスクです。例:
1.2.3.4/24
、2001: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 レスポンスの最上位フィールドです。