Wcześniej aplikacje internetowe wymagały rozszerzeń przeglądarki do korzystania z zaawansowanych funkcji DNS, takich jak DANE, wykrywanie usług DNS-SD, a nawet do rozwiązania czegokolwiek innego niż adresy IP, np. rekordów MX. Aby korzystać z funkcji zależnych od DNSSEC (takich jak rekordy SSH), wszystkie takie rozszerzenia muszą samodzielnie sprawdzać zabezpieczenia DNSSEC, ponieważ przeglądarka lub system operacyjny mogą tego nie zrobić.
Od 2016 r. Google Cloud DNS oferuje interfejs API do obsługi DoH z weryfikacją DNSSEC, który nie wymaga konfiguracji przeglądarki ani rozszerzenia systemu operacyjnego. Proste parametry zapytania GET i odpowiedzi JSON pozwalają klientom analizować wyniki za pomocą popularnych internetowych interfejsów API i unikać złożonych szczegółów formatu DNS, takich jak kompresja wskaźnika na potrzeby nazw domen.
Na tej stronie dokumentacji znajdziesz ogólne informacje o funkcji DoH, takie jak nagłówki HTTP, obsługa przekierowań, sprawdzone metody ochrony prywatności oraz kody stanu HTTP.
Strona Secure Transports zawiera przykłady wiersza poleceń curl
DoH oraz informacje typowe dla DoH i DNS przez DoT, takie jak obsługa TLS i skracanie DNS.
Specyfikacja interfejsu API JSON
Wszystkie wywołania interfejsu API są żądaniami GET HTTP. W przypadku duplikatów parametrów używana jest tylko pierwsza wartość.
Obsługiwane parametry
- name
ciąg, wymagany
Jedyny wymagany parametr. Akceptowane są zmiany znaczenia ukośnika prawego RFC 4343.
- Długość (po zastąpieniu modyfikacji ukośnikiem lewym) musi mieścić się w zakresie od 1 do 253 (ignorując opcjonalną kropkę na końcu).
- Wszystkie etykiety (części nazw między kropkami) muszą mieć od 1 do 63 bajtów.
- Nieprawidłowe nazwy, takie jak
.example.com
,example..com
lub pusty ciąg, otrzymują nieprawidłowe żądanie 400. - Znaki inne niż ASCII powinny mieć wartość punycode (
xn--qxam
, aελ
).
- Typ
ciąg, wartość domyślna:
1
Typ RR może być liczbą w ciągu [1, 65535] lub ciągiem kanonicznym (wielkość liter nie jest rozróżniana, np.
A
lubaaaa
). Możesz użyć wartości255
w przypadku zapytań typu &&39;ANY' ale pamiętaj, że nie służy ona do wysyłania zapytań zarówno w przypadku rekordów A, jak i AAAA czy MX. Wiarygodne serwery nazw nie muszą zwracać wszystkich rekordów dla takich zapytań. Niektóre nie odpowiadają, a inne (np. cloudflare.com) zwracają tylko informacje HINFO.- cd
wartość logiczna, domyślnie:
false
Flaga CD (sprawdzanie wyłączonej). Aby wyłączyć weryfikację DNSSEC, użyj
cd=1
lubcd=true
. Aby włączyć weryfikację DNSSEC, użyj parametrucd=0
,cd=false
lub braku parametrucd
.- ilość
ciąg, wartość domyślna: pusta
Oczekiwana opcja typu treści. Użyj
ct=application/dns-message
, aby otrzymać binarną wiadomość DNS w treści HTTP odpowiedzi, zamiast tekstu JSON. Użyj aplikacjict=application/x-javascript
, aby wyraźnie wskazać tekst w pliku JSON. Inne typy treści są ignorowane i zwracane są domyślne treści JSON.- do
wartość logiczna, domyślnie:
false
flaga DO (DNSSEC OK). Aby uwzględnić rekordy DNSSEC (RRSIG, NSEC, NSEC3), użyj
do=1
lubdo=true
. Aby pominąć rekordy DNSSEC, użyjdo=0
,do=false
lub żadnego parametrudo
.Aplikacje powinny zawsze obsługiwać (i w razie potrzeby ignorować) wszystkie rekordy DNSSEC w odpowiedziach JSON, ponieważ inne implementacje mogą je zawsze uwzględniać. W przyszłości możemy zmienić domyślne działanie odpowiedzi JSON. binarne odpowiedzi DNS zawsze przestrzegają wartości flagi DO.
- edns_client_subnet
ciąg, wartość domyślna: pusta
Opcja edns0-client-subnet. Format to adres IP z maską podsieci. Przykłady:
1.2.3.4/24
,2001:700:300::/48
.Jeśli używasz DNS-over-HTTPS z powodu kwestii związanych z prywatnością i nie chcesz, aby żadna część adresu IP była wysyłana do wiarygodnych serwerów nazw pod kątem dokładności lokalizacji geograficznej, użyj
edns_client_subnet=0.0.0.0/0
. Publiczny serwer DNS Google zazwyczaj wysyła przybliżone informacje o sieci (zwykle wymazuje ostatnią część adresu IPv4).- losowe_dopełnienie
ciąg, ignorowany
Wartość tego parametru jest ignorowana. Przykład:
XmkMw~o_mgP2pf.gpw-Oi5dK
.Klienci korzystający z interfejsów API mają obawy o możliwości przeprowadzania ataków polegających na ochronie kanału w kanale z użyciem rozmiarów pakietów żądań GET z protokołem HTTPS, aby zagwarantować, że wszystkie żądania będą miały taki sam rozmiar jak żądania dopełnione losowymi danymi. Aby zapobiec nieprawidłowej interpretacji adresu URL, ogranicz znaki dopełnienia do niezarezerwowanych znaków adresu URL: dużych i małych liter, cyfr, łączników, kropek, podkreśleń i tyldy.
Odpowiedź DNS w formacie JSON
Udana odpowiedź (komentarze nie pojawiają się 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
}
Więcej informacji o „długości prefiksu zakresu” i jego wpływie na pamięć podręczną znajdziesz w dokumencie RFC 7871 (podsieć klienta DNS).
Komunikat o błędzie zawierający informacje diagnostyczne:
{
"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 JSON, z uwzględnieniem dłuższych formatów rekordów TXT, takich jak RFC 4408 (SPF) czy RFC 4871 (DKIM).
EDNS,
Ogólny mechanizm rozszerzenia EDNS nie jest obsługiwany. Opcja Podsieć klienta EDNS (edns-client-subnet) to parametr w żądaniu GET i pole najwyższego poziomu w odpowiedzi JSON.