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

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

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

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

सुरक्षित परिवहन पेज पर, DoH के लिए curl कमांड लाइन के उदाहरण होते हैं. साथ ही, TLS और DoT के साथ-साथ DoH और डीएनएस के लिए सामान्य जानकारी, जैसे कि TLS की सुविधा और डीएनएस ट्रंकेशन के बारे में जानकारी दी जाती है.

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

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

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

नाम

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

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

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

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

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

सीडी

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

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

आइटम

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

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

do

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

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

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

edns_client_subnet

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

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

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

रैंडम_पैडिंग

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

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

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

JSON के रिस्पॉन्स को 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
}

“RFC प्रीफ़िक्स-लंबाई” और इसके कैशिंग पर पड़ने वाले असर के बारे में जानने के लिए, आरएफ़सी 7871 (EDNS क्लाइंट सबनेट) देखें.

गड़बड़ी की जानकारी के साथ कोई जवाब न मिलना:

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

डीएनएस स्ट्रिंग

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

ईडीएनएस

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