Interfejs API JSON dla DNS przez HTTPS (DoH)

Dotychczas aplikacje internetowe wymagały rozszerzeń przeglądarki do korzystania z zaawansowanych funkcji funkcje DNS, takie jak DANE, wykrywanie usług DNS-SD, a nawet w inny sposób niż adresy IP, na przykład rekordy MX. Aby korzystać z funkcji zależnych od DNSSEC, takich jak rekordy SSHFP, wszelkie takie rozszerzenia zweryfikowanie zabezpieczeń DNSSEC samodzielnie, ponieważ przeglądarka lub system operacyjny może tego nie zrobić.

Od 2016 r. Google Public DNS oferuje łatwy w internecie interfejs API dla DoH przy użyciu DNSSEC weryfikację, która nie wymaga konfiguracji ani rozszerzeń przeglądarki lub systemu operacyjnego. Proste parametry zapytania i odpowiedzi JSON metody GET pozwalają klientom analizować za pomocą popularnych internetowych interfejsów API oraz uniknąć złożonych szczegółów formatu komunikatów DNS, takich jak kompresji wskaźników dla nazw domen.

Więcej informacji na temat DoH znajdziesz na ogólnej stronie dokumentacji DoH. takie jak nagłówki HTTP, obsługa przekierowań, sprawdzone metody ochrony prywatności Kody stanu HTTP.

Na stronie Bezpieczne przesyłki Przykłady wiersza poleceń curl dla DoH oraz informacje wspólne dla DoH i DNS przez Protokół TLS (DoT), na przykład obsługa TLS i obcinanie rekordów 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, wymagany

Jedyny wymagany parametr. Dopuszczalne są znaki ukośnika lewego zgodnie ze standardem RFC 4343.

  • Długość (po zastąpieniu ukośnika lewego) musi mieścić się w zakresie od 1 do 253, (ignorując opcjonalną kropkę na końcu, jeśli występuje).
  • Wszystkie etykiety (części nazw między kropkami) muszą mieć od 1 do 63 bajtów.
  • Uzyskują nieprawidłowe nazwy, np. .example.com, example..com lub pusty ciąg 400 Nieprawidłowe żądanie.
  • Znaki spoza tabeli znaków ASCII powinny być punycoded (xn--qxam, a nie ελ).
typ

ciąg znaków, domyślnie: 1

Typ RR może być liczbą w ciągu [1, 65535] lub ciągiem kanonicznym. (wielkość liter nie jest rozróżniana, np. A lub aaaa). Możesz użyć 255 dla „ANY” ale pamiętaj, że nie jest to do wysyłania zapytań zarówno w przypadku rekordów A, jak i AAAA lub MX. Wiarygodne serwery nazw nie muszą zwracać wszystkich rekordów dla takich zapytań; niektóre nie odpowiadają, a inne (np. cloudflare.com) zwracają tylko HINFO.

cd

wartość logiczna, wartość domyślna: false

Flaga CD (Sprawdzanie wyłączone). Użyj cd=1 lub cd=true, aby wyłączyć weryfikację DNSSEC; użyj parametru cd=0, cd=false lub żadnego parametru cd, aby włączyć weryfikację DNSSEC.

ilość

ciąg znaków, domyślnie: puste

Opcja odpowiedniego typu treści. Użyj ct=application/dns-message, aby otrzymać binarny komunikat DNS w treść HTTP odpowiedzi zamiast tekstu JSON. Użyj ct=application/x-javascript, aby jawnie zażądać tekstu JSON. Inne wartości typu treści są ignorowane, a zwracana jest domyślna treść JSON.

jaki

wartość logiczna, wartość domyślna: false

Flaga DO (DNSSEC OK). Użyj do=1 lub do=true, aby uwzględnić rekordy DNSSEC (RRSIG, NSEC, NSEC3); użyj parametru do=0, do=false lub żadnego parametru do, aby pominąć rekordy DNSSEC.

Aplikacje zawsze powinny obsługiwać (i ignorować, jeśli to konieczne) wszystkie DNSSEC w odpowiedziach JSON, ponieważ inne implementacje mogą je zawsze uwzględniać, W przyszłości możemy zmienić domyślne zachowanie odpowiedzi JSON. Pliki binarne odpowiedzi komunikatów DNS zawsze uwzględniają wartość flagi DO.

edns_client_subnet

ciąg znaków, domyślnie: puste

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 ze względu na kwestie dotyczące prywatności i nie chcesz, jakąkolwiek część Twojego adresu IP, która ma być wysyłana na wiarygodne serwery nazw. aby sprawdzić dokładność 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 wyzerowanie ostatniej części adresu IPv4).

random_padding

string, ignorowany

Wartość tego parametru jest ignorowana. Przykład: XmkMw~o_mgP2pf.gpw-Oi5dK.

klienci interfejsów API zaniepokojeni możliwymi atakami dotyczącymi prywatności po stronie kanału, wykorzystując Rozmiary pakietów żądań HTTPS GET mogą spowodować, że wszystkie żądania będą dokładnie tego samego rozmiaru przez dopełnienie żądań danymi losowymi. 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

Pomyślna odpowiedź (dodane tutaj 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
}

Zapoznaj się z dokumentem RFC 7871 (podsieć klienta EDNS), aby dowiedzieć się więcej. szczegółowe informacje o „długości prefiksu zakresu” i o tym, jak wpływa on na buforowanie.

Odpowiedź dotycząca błędu wraz 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 osadzonym cudzysłowem 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 znaków DNS

Wszystkie rekordy TXT są zakodowane jako pojedynczy ciąg znaków JSON, w tym użycie dłuższego rekordu TXT. formatów nagrywania, takich jak RFC 4408 (SPF) lub RFC 4871 (DKIM).

protokół EDNS

Ogólny mechanizm rozszerzenia EDNS nie jest obsługiwany. Opcja Podsieć klienta EDNS (edns-client-subnet) to parametr w kluczu Żądanie GET i pole najwyższego poziomu w odpowiedzi JSON.