以前は、ウェブベースのアプリケーションでは、DANE や DNS-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 バックスラッシュ エスケープが使用できます。
- type
文字列、デフォルト:
1
RR タイプは、[1, 65535] の数値または正規文字列(
A
やaaaa
など大文字と小文字を区別しない)として表すことができます。'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/24
、2001: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 レスポンスの最上位フィールドです。