एचटीटीपीएस पर डीएनएस के लिए JSON एपीआई (DoH)

पहले, वेब-आधारित ऐप्लिकेशन को बेहतर DNS सुविधाओं जैसे DANE, डीएनएस-एसडी सेवा खोज का इस्तेमाल करने या यहां तक कि आईपी पतों के अलावा किसी भी दूसरे काम – जैसे MX रिकॉर्ड का समाधान करने के लिए ब्राउज़र एक्सटेंशन की ज़रूरत होती थी. डीएनएसएसईसी पर आधारित SSHFP रिकॉर्ड जैसी सुविधाओं का इस्तेमाल करने के लिए, ऐसे किसी भी एक्सटेंशन को खुद डीएनएसएसईसी की पुष्टि करनी होगी, क्योंकि ब्राउज़र या ओएस शायद ऐसा नहीं करते.

साल 2016 से, Google की सार्वजनिक डीएनएस सेवा ने डीएनएसएसईसी की पुष्टि के साथ, DoH के लिए वेब-फ़्रेंडली एपीआई ऑफ़र किया है. इसके लिए, ब्राउज़र या ओएस कॉन्फ़िगरेशन या एक्सटेंशन की ज़रूरत नहीं है. आसान GET क्वेरी पैरामीटर और JSON जवाबों की मदद से क्लाइंट, सामान्य वेब एपीआई का इस्तेमाल करके नतीजों को पार्स कर सकते हैं. साथ ही, डोमेन नेम के लिए पॉइंटर कंप्रेस करने जैसे मुश्किल डीएनएस मैसेज फ़ॉर्मैट की जानकारी से बच सकते हैं.

आम तौर पर, DoH के बारे में जानकारी के लिए, सामान्य DoH दस्तावेज़ पेज देखें. जैसे, एचटीटीपी हेडर, रीडायरेक्ट हैंडलिंग, निजता से जुड़े सबसे सही तरीके, और एचटीटीपी स्टेटस कोड.

सिक्योर ट्रांसपोर्ट पेज पर, डीओएच के लिए curl कमांड लाइन के उदाहरण दिए गए हैं. साथ ही, डीओएच और डीएनएस ओवर TLS (DoT) के लिए सामान्य जानकारी भी दी गई है. जैसे, TLS सहायता और डीएनएस में काट-छांट.

JSON एपीआई की खास बातें

सभी एपीआई कॉल, एचटीटीपी जीईटी अनुरोध होते हैं. डुप्लीकेट पैरामीटर के मामले में, सिर्फ़ पहली वैल्यू का इस्तेमाल किया जाता है.

काम करने वाले पैरामीटर

नाम

स्ट्रिंग, ज़रूरी है

एकमात्र ज़रूरी पैरामीटर. आरएफ़सी 4343 बैकस्लैश एस्केप स्वीकार किए जाते हैं.

  • बैकस्लैश एस्केप को बदलने के बाद की लंबाई 1 से 253 के बीच होनी चाहिए (अगर कोई पिछला बिंदु मौजूद हो, तो उसे अनदेखा करना).
  • सभी लेबल (डॉट के बीच के नाम के हिस्से) 1 से 63 बाइट लंबे होने चाहिए.
  • .example.com, example..com जैसे अमान्य नाम या खाली स्ट्रिंग को 400 गलत अनुरोध मिलता है.
  • बिना ASCII वाले वर्णों को punycode होना चाहिए (xn--qxam, ελ नहीं).
टाइप करें

स्ट्रिंग, डिफ़ॉल्ट: 1

RR के प्रकार को [1, 65535] या कैननिकल स्ट्रिंग में संख्या के रूप में दिखाया जा सकता है (केस-इनसेंसिटिव, जैसे कि A या aaaa). 'कोई भी' क्वेरी के लिए 255 का इस्तेमाल किया जा सकता है, लेकिन ध्यान रखें कि यह A और AAAA या MX रिकॉर्ड, दोनों के लिए क्वेरी भेजने के लिए नहीं है. यह ज़रूरी नहीं है कि अनुमति वाले नेम सर्वर, ऐसी क्वेरी के लिए सभी रिकॉर्ड दिखाएं. कुछ रिकॉर्ड जवाब नहीं देते और कुछ ऐसे नेम सर्वर (जैसे कि cloudflare.com) सिर्फ़ HINFO दिखाते हैं.

cd

बूलियन, डिफ़ॉल्ट: false

सीडी (चेकिंग बंद की गई) फ़्लैग. डीएनएसएसईसी की पुष्टि को बंद करने के लिए cd=1 या cd=true का इस्तेमाल करें. डीएनएसएसईसी की पुष्टि करने की सुविधा को चालू करने के लिए, cd=0, cd=false या कोई cd पैरामीटर इस्तेमाल नहीं करें.

आइटम

स्ट्रिंग, डिफ़ॉल्ट: खाली

अपनी पसंद का कॉन्टेंट टाइप. रिस्पॉन्स के एचटीटीपी मुख्य हिस्से में, JSON टेक्स्ट के बजाय बाइनरी डीएनएस मैसेज पाने के लिए, ct=application/dns-message का इस्तेमाल करें. JSON टेक्स्ट का साफ़ तौर पर अनुरोध करने के लिए, ct=application/x-javascript का इस्तेमाल करें. कॉन्टेंट के अन्य टाइप की वैल्यू को नज़रअंदाज़ कर दिया जाता है और डिफ़ॉल्ट JSON कॉन्टेंट दिखाया जाता है.

do

बूलियन, डिफ़ॉल्ट: false

DO (डीएनएसएसईसी OK) फ़्लैग. डीएनएसएसईसी रिकॉर्ड (RRSIG, NSEC, NSEC3) को शामिल करने के लिए do=1 या do=true का इस्तेमाल करें. डीएनएसएसईसी रिकॉर्ड को छोड़ने के लिए, do=0, do=false या कोई do पैरामीटर इस्तेमाल न करें.

ऐप्लिकेशन को, JSON के रिस्पॉन्स में किसी भी डीएनएसएसईसी रिकॉर्ड को हमेशा मैनेज करना चाहिए और अगर ज़रूरी हो, तो उसे अनदेखा करना चाहिए. ऐसा इसलिए, क्योंकि अन्य तरीकों में वे रिकॉर्ड हमेशा शामिल हो सकते हैं. साथ ही, हम आने वाले समय में JSON के जवाबों के डिफ़ॉल्ट व्यवहार को बदल सकते हैं. (बाइनरी डीएनएस मैसेज के जवाबों में हमेशा डीओ फ़्लैग की वैल्यू का ध्यान रखा जाता है.)

edns_client_subnet

स्ट्रिंग, डिफ़ॉल्ट: खाली

edns0-client-सबनेट का विकल्प. फ़ॉर्मैट एक ऐसा आईपी पता है जिसमें सबनेट मास्क होता है. उदाहरण: 1.2.3.4/24, 2001:700:300::/48.

अगर निजता से जुड़ी समस्याओं की वजह से डीएनएस-ओवर-एचटीटीपीएस का इस्तेमाल किया जा रहा है और जगह की सटीक जानकारी के लिए, अपने आईपी पते का कोई भी हिस्सा भरोसेमंद नेम सर्वर पर नहीं भेजा जाना है, तो edns_client_subnet=0.0.0.0/0 का इस्तेमाल करें. Google का सार्वजनिक डीएनएस आम तौर पर नेटवर्क की अनुमानित जानकारी भेजता है. आम तौर पर, आईपीवी4 पते का आखिरी हिस्सा शून्य किया जाता है.

random_padding

स्ट्रिंग, इसे अनदेखा किया गया

इस पैरामीटर की वैल्यू को अनदेखा कर दिया जाता है. उदाहरण: XmkMw~o_mgP2pf.gpw-Oi5dK.

एचटीटीपीएस GET अनुरोधों के पैकेट साइज़ का इस्तेमाल करके साइड-चैनल की निजता से जुड़े संभावित हमलों को लेकर चिंतित एपीआई क्लाइंट, इसका इस्तेमाल कर सकते हैं. ऐसा करके वे किसी भी डेटा के साथ अनुरोधों को पैडिंग (जगह) करके, सभी अनुरोधों को एक जैसा साइज़ बना सकते हैं. यूआरएल को गलत तरीके से समझने से बचने के लिए, पैडिंग वर्णों को यूआरएल के असुरक्षित वर्णों तक सीमित रखें: ऊपरी और छोटे अक्षर, अंक, हाइफ़न, पीरियड, अंडरस्कोर, और टिल्ड.

JSON में डीएनएस रिस्पॉन्स

एक सही जवाब (यहां जोड़ी गई टिप्पणियां वास्तविक जवाबों में मौजूद नहीं हैं):

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

"स्कोप प्रीफ़िक्स की लंबाई" और कैश मेमोरी पर इसका असर जानने के लिए आरएफ़सी 7871 (ईडीएनएस क्लाइंट सबनेट) देखें.

गड़बड़ी की जानकारी के साथ गड़बड़ी का जवाब:

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

एम्बेड किए गए कोटेशन और नेम सर्वर एट्रिब्यूशन वाले SPF और TXT रिकॉर्ड:

{
  "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 स्ट्रिंग

सभी TXT रिकॉर्ड, एक JSON स्ट्रिंग के तौर पर एन्कोड किए जाते हैं. इसमें, लंबे TXT रिकॉर्ड फ़ॉर्मैट का इस्तेमाल किया जाता है, जैसे कि RFC 4408 (SPF) या RFC 4871 (DKIM).

ईडीएनएस

सामान्य Eडीएनएस एक्सटेंशन को इस्तेमाल नहीं किया जा सकता. Eडीएनएस क्लाइंट सबनेट विकल्प (edns-client-subnet) होता है, जो GET अनुरोध का एक पैरामीटर होता है. साथ ही, यह JSON के रिस्पॉन्स में टॉप लेवल फ़ील्ड भी होता है.