Interfejs API JSON dla DNS przez HTTPS (DoH)

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 lub aaaa). 255W przypadku zapytań typu „ANY” możesz użyć operatora 255, 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 lub cd=true. Aby włączyć weryfikację DNSSEC, użyj parametru cd=0, cd=false lub brak parametru cd.

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żyj ct=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 lub do=true, aby uwzględnić rekordy DNSSEC (RRSIG, NSEC, NSEC3). Aby pominąć rekordy DNSSEC, użyj do=0, do=false lub brak parametru do.

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.