HTTPS üzerinden DNS için JSON API (DoH)

Önceden, web tabanlı uygulamalarda gelişmiş uygulamalar kullanmak için tarayıcı uzantıları gerekiyordu DANE, DNS-SD hizmet keşfi gibi DNS özellikleri ve hatta (MX kayıtları gibi) IP adreslerinden başka her şey. SSHFP kayıtları gibi DNSSEC'ye bağlı özellikleri kullanmak için bu tür uzantılar DNSSEC'yi kendisinin doğrulaması gerekir. Çünkü tarayıcı veya işletim sistemi bunu doğrulamayabilir.

Google Public DNS, 2016'dan beri DNSSEC ile DoH için web dostu bir API sunuyor Tarayıcı veya işletim sistemi yapılandırması ya da uzantıları gerektirmeyen doğrulama. Basit GET sorgu parametreleri ve JSON yanıtları, istemcilerin arama sonuçlarında görünmesini sağlayın ve karmaşık DNS ileti biçimi ayrıntıları gibi alan adları için işaretçi sıkıştırma.

DoH hakkında bilgi edinmek için genel DoH dokümanları sayfasını inceleyin. ve HTTP üstbilgileri, yönlendirme işleme, gizlilikle ilgili en iyi uygulamalar ve HTTP durum kodları.

Güvenli Aktarım sayfasında DoH için curl komut satırı örnekleri ve DoH ve DNS üzerinden ortak bilgiler TLS (DoT) sağlayın. Örneğin, TLS desteği ve DNS kesme.

JSON API Spesifikasyonu

Tüm API çağrıları, HTTP GET istekleridir. Yinelenen parametreler söz konusu olduğunda yalnızca ilk değer kullanılır.

Desteklenen parametreler

ad

dize, gerekli

Zorunlu tek parametre. RFC 4343 ters eğik çizgi çıkışları kabul edilir.

  • Uzunluk (ters eğik çizgi kaçışları değiştirildikten sonra) 1 ile arasında olmalıdır 253 (varsa, isteğe bağlı sondaki nokta dikkate alınmaz).
  • Tüm etiketler (noktalar arasındaki adın kısımları) 1 ila 63 bayt uzunluğunda olmalıdır.
  • .example.com, example..com veya boş dize gibi geçersiz adlar 400 Hatalı İstek.
  • ASCII olmayan karakterler punycode olmalıdır (ελ değil, xn--qxam).
tür

dize, varsayılan: 1

RR türü, [1, 65535] içindeki bir sayı veya standart bir dizeyle temsil edilebilir (ör. A veya aaaa) büyük/küçük harfe duyarlı değil. 255 değerini "HERHANGİ BİRİ" için kullanabilirsiniz ancak bunun bir değil yerine kullanın. Yetkili alan adı sunucularının bu tür sorgular için tüm kayıtları döndürmesi gerekmez; bazıları yanıt vermez, bazılarıysa (cloudflare.com gibi) yalnızca HINFO döndürür.

cd

boole, varsayılan: false

CD (İşaretleme Devre Dışı) işareti. DNSSEC doğrulamasını devre dışı bırakmak için cd=1 veya cd=true kullanın; DNSSEC doğrulamasını etkinleştirmek için cd=0, cd=false veya cd parametresi kullanmayın.

adt

dize, varsayılan: boş

İstenen içerik türü seçeneği. ct=application/dns-message komutunu kullanarak JSON metni yerine yanıt HTTP gövdesi. JSON metnini açıkça istemek için ct=application/x-javascript kullanın. Diğer içerik türü değerleri yoksayılır ve varsayılan JSON içeriği döndürülür.

yap

boole, varsayılan: false

DO (DNSSEC OK) işareti. DNSSEC kayıtlarını (RRSIG, NSEC, NSEC3) eklemek için do=1 veya do=true kullanın. DNSSEC kayıtlarını atlamak için do=0, do=false veya do parametresi kullanmayın.

Uygulamalar tüm DNSSEC'leri işlemeli (ve gerekirse bunları yoksaymalıdır) diğer uygulamalar her zaman bunları içerebileceğinden, JSON yanıtlarında kayıt ve JSON yanıtlarının varsayılan davranışını ileride değiştirebiliriz. (İkili DNS ileti yanıtları her zaman DO işareti değerine uyar.)

edns_client_subnet

dize, varsayılan: boş

edns0-client-subnet seçeneği. Biçim, alt ağ maskesine sahip bir IP adresidir. Örnekler: 1.2.3.4/24, 2001:700:300::/48.

Gizlilikle ilgili endişeler nedeniyle DNS-over-HTTPS kullanıyorsanız ve IP adresinizin yetkili alan adı sunucularına gönderilecek herhangi bir bölümü coğrafi konum doğruluğu için edns_client_subnet=0.0.0.0/0 kullanın. Google Açık DNS normalde yaklaşık ağ bilgilerini gönderir (genellikle IPv4 adresinizin son kısmı sıfırlanır).

random_padding

dize, yoksayıldı

Bu parametrenin değeri yoksayılır. Örnek: XmkMw~o_mgP2pf.gpw-Oi5dK.

HTTPS GET isteklerinin paket boyutları, bunu tüm istekleri tam olarak isteklerine göre aynı boyutta seçimler yapmak için kullanılır. URL'nin yanlış yorumlanmasını önlemek için dolgu karakterlerini kısıtlayın ayrılmamış URL karakterlerine ekleyin: büyük ve küçük harfler, rakamlar, kısa çizgi, nokta, alt çizgi ve yaklaşık işareti içermelidir.

JSON'de DNS yanıtı

Başarılı bir yanıt (buraya eklenen yorumlar gerçek yanıtlarda yoktur):

{
  "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
}

RFC 7871 (EDNS İstemci Alt Ağı) ile ilgili daha fazla bilgi "kapsam ön eki uzunluğu" ve bunun önbelleğe almayı nasıl etkilediği hakkında ayrıntılar.

Teşhis bilgilerini içeren bir hata yanıtı:

{
  "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/."
}

Yerleştirilmiş tırnak işaretleri ve alan adı sunucusu özellikleri içeren SPF ve TXT kayıtları:

{
  "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 dizeleri

Tüm TXT kayıtları, daha uzun TXT kullanımları da dahil olmak üzere tek bir JSON dizesi olarak kodlanır kayıt formatları RFC 4408 (SPF) veya RFC 4871 (DKIM).

EDNS

Genel EDNS uzantı mekanizması desteklenmez. EDNS İstemci Alt Ağı seçeneği (edns-client-subnet), GET isteği ve JSON yanıtında üst düzey bir alan.