JSON API برای DNS از طریق HTTPS (DoH)

قبلاً، برنامه‌های مبتنی بر وب برای استفاده از ویژگی‌های پیشرفته DNS مانند DANE ، کشف سرویس DNS-SD یا حتی برای حل هر چیزی غیر از آدرس‌های IP - مانند رکوردهای MX، به برنامه‌های افزودنی مرورگر نیاز داشتند. برای استفاده از ویژگی‌های وابسته به DNSSEC مانند رکوردهای SSHFP ، هر یک از این پسوندها باید خودشان DNSSEC را تأیید کنند، زیرا ممکن است مرورگر یا سیستم عامل این کار را انجام ندهند.

از سال 2016، Google Public DNS یک API سازگار با وب برای DoH با اعتبارسنجی DNSSEC ارائه کرده است که نیازی به پیکربندی مرورگر یا سیستم عامل یا برنامه‌های افزودنی ندارد. پارامترهای ساده GET query و پاسخ‌های JSON به مشتریان اجازه می‌دهند تا نتایج را با استفاده از APIهای رایج وب تجزیه کنند و از جزئیات فرمت پیام DNS پیچیده مانند فشرده‌سازی اشاره‌گر برای نام دامنه اجتناب کنند.

برای اطلاعات کلی درباره DoH، مانند سرصفحه‌های HTTP، مدیریت تغییر مسیر، بهترین شیوه‌های حفظ حریم خصوصی، و کدهای وضعیت HTTP، به صفحه اسناد عمومی DoH مراجعه کنید.

صفحه Secure Transports دارای نمونه‌های خط فرمان curl برای DoH و اطلاعات مشترک DoH و DNS از طریق TLS (DoT) است، مانند پشتیبانی TLS و برش DNS.

مشخصات JSON API

همه تماس‌های API درخواست‌های HTTP GET هستند. در مورد پارامترهای تکراری، فقط از مقدار اول استفاده می شود.

پارامترهای پشتیبانی شده

نام

رشته، مورد نیاز

تنها پارامتر مورد نیاز بک اسلش RFC 4343 پذیرفته می شود.

  • طول (پس از جایگزینی بک اسلش) باید بین 1 تا 253 باشد (در صورت وجود یک نقطه انتهایی اختیاری نادیده گرفته شود).
  • تمام برچسب ها (بخش هایی از نام بین نقطه ها) باید 1 تا 63 بایت باشند.
  • نام‌های نامعتبر مانند .example.com ، example..com یا رشته خالی 400 Bad Request دریافت می‌کنند.
  • کاراکترهای غیر ASCII باید کدگذاری شوند ( xn--qxam ، نه ελ ).
نوع

رشته، پیش فرض: 1

نوع RR می تواند به عنوان یک عدد در [1، 65535] یا یک رشته متعارف (بدون حساس به حروف، مانند A یا aaaa ) نمایش داده شود. شما می‌توانید 255 برای درخواست‌های 'ANY' استفاده کنید، اما توجه داشته باشید که این جایگزینی برای ارسال درخواست‌ها برای هر دو رکورد A و AAAA یا MX نیست . سرورهای نام معتبر نیازی به بازگرداندن تمام رکوردها برای چنین درخواست هایی ندارند. برخی پاسخ نمی دهند و برخی دیگر (مانند cloudflare.com) فقط HINFO را برمی گردانند.

سی دی

بولی، پیش فرض: false

پرچم CD (Checking Disabled) برای غیرفعال کردن اعتبارسنجی DNSSEC از cd=1 یا cd=true استفاده کنید. برای فعال کردن اعتبارسنجی DNSSEC از پارامترهای cd=0 ، cd=false یا بدون cd استفاده کنید.

ct

رشته، پیش فرض: خالی

گزینه نوع محتوای مورد نظر از ct=application/dns-message برای دریافت پیام DNS باینری در متن پاسخ HTTP به جای متن JSON استفاده کنید. برای درخواست صریح متن JSON از ct=application/x-javascript استفاده کنید. سایر مقادیر نوع محتوا نادیده گرفته می شوند و محتوای پیش فرض JSON برگردانده می شود.

انجام دهید

بولی، پیش فرض: false

پرچم DO (DNSSEC OK). برای گنجاندن رکوردهای DNSSEC (RRSIG، NSEC، NSEC3) از do=1 یا do=true استفاده کنید. برای حذف رکوردهای DNSSEC از پارامتر do=0 ، do=false یا no do استفاده کنید.

برنامه‌ها باید همیشه رکوردهای DNSSEC را در پاسخ‌های JSON کنترل کنند (و در صورت لزوم نادیده بگیرند، زیرا سایر پیاده‌سازی‌ها ممکن است همیشه آنها را شامل شوند، و ممکن است رفتار پیش‌فرض پاسخ‌های JSON را در آینده تغییر دهیم. (پاسخ های پیام DNS باینری همیشه به ارزش پرچم DO احترام می گذارد.)

edns_client_subnet

رشته، پیش فرض: خالی

گزینه edns0-client-subnet. فرمت یک آدرس IP با ماسک زیر شبکه است. مثال‌ها: 1.2.3.4/24 ، 2001:700:300::/48 .

اگر به دلیل نگرانی در مورد حفظ حریم خصوصی از DNS-over-HTTPS استفاده می کنید و نمی خواهید هیچ بخشی از آدرس IP شما برای دقت موقعیت جغرافیایی به سرورهای نام معتبر ارسال شود، از edns_client_subnet=0.0.0.0/0 استفاده کنید. Google Public DNS معمولاً اطلاعات شبکه تقریبی را ارسال می کند (معمولاً آخرین قسمت آدرس IPv4 شما را صفر می کند).

random_padding

رشته، نادیده گرفته شد

مقدار این پارامتر نادیده گرفته می شود. مثال: XmkMw~o_mgP2pf.gpw-Oi5dK .

کلاینت های API که نگران حملات احتمالی حریم خصوصی کانال جانبی با استفاده از اندازه بسته درخواست های HTTPS GET هستند، می توانند از این برای ایجاد همه درخواست ها دقیقاً به اندازه یکسان با اضافه کردن درخواست ها با داده های تصادفی استفاده کنند. برای جلوگیری از تفسیر نادرست URL، کاراکترهای padding را به کاراکترهای URL رزرو نشده محدود کنید: حروف بزرگ و کوچک، اعداد، خط فاصله، نقطه، زیرخط و tilde.

پاسخ DNS در 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
    }
  ],
}

رشته های DNS

همه رکوردهای TXT به عنوان یک رشته JSON کدگذاری می شوند که از فرمت های ضبط طولانی تر TXT مانند RFC 4408 (SPF) یا RFC 4871 (DKIM) استفاده می کند.

EDNS

مکانیسم عمومی گسترش EDNS پشتیبانی نمی شود. گزینه EDNS Client Subnet (edns-client-subnet) یک پارامتر در درخواست GET و یک فیلد سطح بالا در پاسخ JSON است.