Bisher mussten für webbasierte Anwendungen Browsererweiterungen verwendet werden, um erweiterte DNS-Funktionen wie DANE, die DNS-SD-Diensterkennung oder sogar andere IP-Adressen wie MX-Einträge aufzulösen. Wenn Sie DNSSEC-abhängige Funktionen wie SSHFP-Einträge verwenden möchten, müssen solche Erweiterungen DNSSEC selbst validieren, da dies im Browser oder Betriebssystem möglicherweise nicht der Fall ist.
Seit 2016 bietet Google Public DNS eine webfreundliche API für DoH mit DNSSEC-Validierung an, für die keine Browser- oder Betriebssystemkonfiguration oder -erweiterungen erforderlich sind. Mit einfachen GET-Abfrageparametern und JSON-Antworten können Clients die Ergebnisse mithilfe gängiger Web-APIs parsen und komplexe DNS-Nachrichtenformatdetails wie die Zeigerkomprimierung für Domainnamen vermeiden.
Allgemeine Informationen zur DoH-Dokumentation auf der DoH-Seite, z. B. HTTP-Header, Weiterleitung, Best Practices für den Datenschutz und HTTP-Statuscodes
Auf der Seite Secure Transports finden Sie Beispiele für curl
-Befehlszeilen für DoH sowie Informationen zu DoH und DNS over TLS (DoT), wie TLS-Unterstützung und DNS-Abkürzung.
JSON API-Spezifikation
Alle API-Aufrufe sind HTTP-GET-Anfragen. Bei doppelten Parametern wird nur der erste Wert verwendet.
Unterstützte Parameter
- name
String, erforderlich
Der einzige erforderliche Parameter. RFC 4343-Backslashes sind zulässig.
- Die Länge (nach dem Ersetzen durch umgekehrte Schrägstriche) muss zwischen 1 und 253 liegen. Ignoriert dabei einen optionalen Punkt.
- Alle Labels (Teile des Namens zwischen Punkten) müssen 1 bis 63 Byte lang sein.
- Ungültige Namen wie
.example.com
,example..com
oder ein leerer String erhalten den Fehler „400 Bad Request“. - Nicht-ASCII-Zeichen müssen punycodiert werden (
xn--qxam
, nichtελ
).
- Typ
String, Standard:
1
Der RR-Typ kann als Zahl in [1, 65535] oder als kanonischer String dargestellt werden (Groß-/Kleinschreibung wird nicht berücksichtigt, z. B.
A
oderaaaa
). Sie können255
für Abfragen verwenden, beachten Sie jedoch, dass dies kein Ersatz für das Senden von Abfragen für A- und AAAA- oder MX-Einträge ist. Autoritative Nameserver müssen nicht alle Einträge für solche Abfragen zurückgeben. Einige antworten nicht, während andere (z. B. cloudflare.com) nur HINFO zurückgeben.- cd
Boolescher Wert, Standard:
false
Das Flag „CD“ (Prüfung deaktiviert) Verwenden Sie
cd=1
odercd=true
, um die DNSSEC-Validierung zu deaktivieren. Verwenden Siecd=0
,cd=false
oder keinencd
-Parameter, um die DNSSEC-Validierung zu aktivieren.- Stück
String, Standard: leer
Gewünschte Option für Inhaltstypen. Verwenden Sie
ct=application/dns-message
, um eine binäre DNS-Nachricht im HTTP-Antworttext anstelle von JSON-Text zu erhalten. Verwenden Siect=application/x-javascript
, um JSON-Text explizit anzufordern. Andere Inhaltstypwerte werden ignoriert und JSON-Standardinhalte werden zurückgegeben.- do
Boolescher Wert, Standard:
false
Das Flag DO (DNSSEC OK) Verwenden Sie
do=1
oderdo=true
, um DNSSEC-Einträge einzubeziehen (RRSIG, NSEC, NSEC3). Verwenden Siedo=0
,do=false
oder keinendo
-Parameter, um DNSSEC-Einträge auszuschließen.Anwendungen sollten DNSSEC-Einträge in JSON-Antworten immer verarbeiten (und bei Bedarf ignorieren), da andere Implementierungen sie immer enthalten können. Außerdem können wir das Standardverhalten für JSON-Antworten in Zukunft ändern. (Antworten auf binäre DNS-Nachrichten berücksichtigen immer den Wert des DO-Flags.)
- E-Mail-Client_Subnetz
String, Standard: leer
Die Option „edns0-client-subnet“. Das Format ist eine IP-Adresse mit einer Subnetzmaske. Beispiele:
1.2.3.4/24
,2001:700:300::/48
.Wenn Sie aufgrund von Datenschutzproblemen DNS-over-HTTPS verwenden und nicht möchten, dass ein Teil Ihrer IP-Adresse an zuverlässige Nameserver gesendet wird, sollten Sie
edns_client_subnet=0.0.0.0/0
verwenden. Google Public DNS sendet normalerweise ungefähre Netzwerkinformationen (in der Regel wird der letzte Teil Ihrer IPv4-Adresse auf null gesetzt).- Zufälliger Abstand
String, ignoriert
Der Wert dieses Parameters wird ignoriert. Beispiel:
XmkMw~o_mgP2pf.gpw-Oi5dK
.API-Clients, die Bedenken hinsichtlich möglicher Nebenkanal-Datenschutzangriffe haben, bei denen die Paketgrößen von HTTPS-GET-Anfragen verwendet werden, können hiermit alle Anfragen genau auf dieselbe Größe stellen. Dafür werden Anfragen mit zufälligen Daten aufgefüllt. Um eine falsche Interpretation der URL zu verhindern, solltest du die Padding-Zeichen auf die nicht reservierten URL-Zeichen beschränken: Groß- und Kleinbuchstaben, Ziffern, Bindestrich, Punkt, Unterstrich und Tilde.
DNS-Antwort in JSON
Eine erfolgreiche Antwort (hier hinzugefügte Kommentare sind in den tatsächlichen Antworten nicht vorhanden):
{
"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
}
Weitere Informationen zu „Umfang des Präfixes“ und dazu, wie sich dies auf das Caching auswirkt, finden Sie unter RFC 7871 (EDNS-Clientsubnetz).
Fehlerantwort mit Diagnoseinformationen:
{
"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- und TXT-Einträge mit eingebetteten Anführungszeichen und Nameserver-Attribution:
{
"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-Strings
Alle TXT-Einträge werden als einzelner JSON-String codiert. Dazu zählen auch längere TXT-Eintragsformate wie RFC 4408 (SPF) oder RFC 4871 (DKIM).
EDNS
Der allgemeine EDNS-Erweiterungsmechanismus wird nicht unterstützt. Die Option „EDNS-Clientsubnetz“ (edns-client-subnet) ist ein Parameter in der GET-Anfrage und in der JSON-Antwort ein Feld auf oberster Ebene.