Wcześniej aplikacje internetowe wymagały rozszerzeń przeglądarki do korzystania z zaawansowanych funkcji DNS, takich jak DANE czy wykrywania usług DNS-SD, a nawet do rozwiązywania problemów innych niż adresy IP, na przykład rekordów MX. Aby używać funkcji zależnych od DNSSEC, takich jak rekordy SSHFP, każde takie rozszerzenie musi zweryfikować zabezpieczenia DNSSEC samodzielnie, ponieważ przeglądarka lub system operacyjny mogą tego nie zrobić.
Od 2016 roku Google Public DNS udostępnia przyjazny dla internetu interfejs API dla DoH z weryfikacją DNSSEC, który nie wymaga konfiguracji przeglądarki, systemu operacyjnego ani rozszerzeń. Proste parametry zapytania GET i odpowiedzi JSON pozwalają klientom analizować wyniki za pomocą popularnych interfejsów API i uniknąć skomplikowanych szczegółów formatu wiadomości DNS, takich jak kompresja wskaźnika nazw domen.
Na ogólnej stronie dokumentacji DoH znajdziesz ogólne informacje o DoH, w tym nagłówki HTTP, obsługę przekierowań, sprawdzone metody ochrony prywatności i kody stanu HTTP.
Strona Bezpieczne transport zawiera przykłady wiersza poleceń curl
dla DoH oraz informacje wspólne dla DoH i DNS przez TLS (DoT), takie jak obsługa TLS i obcinanie DNS.
Specyfikacja interfejsu JSON API
Wszystkie wywołania interfejsu API są żądaniami HTTP GET. W przypadku zduplikowanych parametrów używana jest tylko pierwsza wartość.
Obsługiwane parametry
- nazwa
string, wymagane
Jedyny wymagany parametr. Znaki ukośnika odwrotnego w standardzie RFC 4343 są akceptowane.
- Długość (po zastąpieniu ukośnika lewego) musi się mieścić w przedziale od 1 do 253 (jeśli występuje opcjonalna kropka, jeśli występuje)
- Wszystkie etykiety (części nazw między kropkami) muszą mieć od 1 do 63 bajtów.
- Nieprawidłowe nazwy, np.
.example.com
,example..com
, lub pusty ciąg znaków otrzymują błąd 400 Nieprawidłowe żądanie. - Znaki spoza tabeli znaków ASCII powinny być punycoded (
xn--qxam
, nieελ
).
- typ
ciąg znaków, domyślnie:
1
Typ RR może być reprezentowany jako liczba w postaci ciągu [1, 65535] lub jako ciąg kanoniczny (wielkość liter nie jest rozróżniana, np.
A
lubaaaa
).255
W przypadku zapytań typu „ANY” możesz użyć operatora255
, ale pamiętaj, że nie służy to do wysyłania zapytań dotyczących zarówno rekordów A, jak i AAAA albo MX. Wiarygodne serwery nazw nie muszą zwracać wszystkich rekordów w przypadku takich zapytań. Niektóre nie odpowiadają, a inne (np. cloudflare.com) zwracają tylko kod HINFO.- cd
wartość logiczna, domyślnie:
false
Flaga CD (Zaznaczenie wyłączone). Aby wyłączyć weryfikację DNSSEC, użyj
cd=1
lubcd=true
. Aby włączyć weryfikację DNSSEC, użyj parametrucd=0
,cd=false
lub brak parametrucd
.- ilość
ciąg znaków, domyślnie: pusty
Opcja żądanego typu treści. Użyj
ct=application/dns-message
, aby otrzymać binarny komunikat DNS w treści HTTP odpowiedzi zamiast tekstu JSON. Użyjct=application/x-javascript
, aby wyraźnie zażądać tekstu w formacie JSON. Inne wartości typów treści są ignorowane, a zwracana jest domyślna treść JSON.- do
wartość logiczna, domyślnie:
false
Flaga DO (DNSSEC OK). Użyj
do=1
lubdo=true
, aby uwzględnić rekordy DNSSEC (RRSIG, NSEC, NSEC3). Aby pominąć rekordy DNSSEC, użyjdo=0
,do=false
lub brak parametrudo
.Aplikacje powinny zawsze obsługiwać (i w razie potrzeby ignorować) wszelkie rekordy DNSSEC w odpowiedziach JSON, ponieważ inne implementacje zawsze mogą je zawierać. W przyszłości możemy zmienić domyślne zachowanie odpowiedzi JSON. (Binarne odpowiedzi komunikatów DNS zawsze uwzględniają wartość flagi DO).
- edns_client_subnet
ciąg znaków, domyślnie: pusty
Opcja edns0-client-subnet. Format to adres IP z maską podsieci. Przykłady:
1.2.3.4/24
,2001:700:300::/48
.Jeśli korzystasz z DNS-over-HTTPS ze względu na ochronę prywatności i nie chcesz, aby żadna część Twojego adresu IP była wysyłana do wiarygodnych serwerów nazw w celu zapewnienia dokładności lokalizacji geograficznej, użyj
edns_client_subnet=0.0.0.0/0
. Publiczny serwer DNS Google zwykle wysyła przybliżone informacje o sieci (zwykle eliminuje ostatnią część adresu IPv4).- random_padding
ciąg znaków, zignorowano
Wartość tego parametru jest ignorowana. Przykład:
XmkMw~o_mgP2pf.gpw-Oi5dK
.Klienty interfejsu API obawiające się o możliwych ataków prywatności w kanale bocznym korzystających z rozmiarów pakietów żądań HTTPS GET mogą korzystać z tej opcji, aby wysyłać wszystkie żądania dokładnie tego samego rozmiaru przez żądania dopełnienia losowymi danymi. Aby zapobiec nieprawidłowej interpretacji adresu URL, ogranicz dopełnianie do niezarezerwowanych znaków adresu URL: małych i wielkich liter, cyfr, łącznika, kropki, podkreślenia i tyldy.
Odpowiedź DNS w formacie JSON
Pomyślna odpowiedź (dodane tu komentarze nie występują w rzeczywistych odpowiedziach):
{
"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
}
Szczegółowe informacje na temat „długości prefiksu zakresu” i jego wpływu na pamięć podręczną znajdziesz w RFC 7871 (podsieć klienta EDNS).
Odpowiedź o błędzie z informacjami diagnostycznymi:
{
"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/."
}
Rekordy SPF i TXT z osadzonymi cudzysłowami i atrybucją serwera nazw:
{
"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
}
],
}
Ciągi DNS
Wszystkie rekordy TXT są kodowane jako pojedynczy ciąg znaków JSON. Obejmuje to użycie dłuższych formatów rekordów TXT, takich jak RFC 4408 (SPF) lub RFC 4871 (DKIM).
EDNS
Ogólny mechanizm rozszerzenia EDNS nie jest obsługiwany. Opcja podsieci klienta EDNS (edns-client-subnet) to parametr w żądaniu GET i pole najwyższego poziomu w odpowiedzi JSON.