JSON API untuk DNS melalui HTTPS (DoH)

Sebelumnya, aplikasi berbasis web memerlukan ekstensi browser untuk menggunakan fitur DNS seperti DANE, penemuan layanan DNS-SD, atau bahkan untuk me-resolve semua hal selain alamat IP – seperti data MX. Untuk menggunakan fitur yang bergantung pada DNSSEC seperti data SSHFP, ekstensi tersebut harus memvalidasi DNSSEC sendiri, karena browser atau OS mungkin tidak melakukannya.

Sejak tahun 2016, Google Public DNS telah menawarkan API yang sesuai untuk web untuk DoH dengan DNSSEC validasi yang tidak memerlukan konfigurasi atau ekstensi OS atau browser. Parameter kueri GET sederhana dan respons JSON memungkinkan klien menggunakan API web umum dan menghindari detail format pesan DNS yang kompleks seperti kompresi pointer untuk nama domain.

Lihat halaman dokumentasi DoH umum untuk mengetahui informasi tentang DoH secara umum, seperti header HTTP, penanganan pengalihan, praktik terbaik privasi, dan Kode status HTTP.

Halaman Secure Transports memiliki Contoh command line curl untuk DoH, dan informasi yang umum untuk DoH dan DNS melalui TLS (DoT), seperti dukungan TLS dan pemotongan DNS.

Spesifikasi JSON API

Semua panggilan API adalah permintaan GET HTTP. Dalam kasus parameter duplikat, hanya nilai pertama yang akan digunakan.

Parameter yang didukung

nama

string, wajib

Satu-satunya parameter yang diperlukan. Escape garis miring terbalik RFC 4343 diterima.

  • Panjang (setelah mengganti escape garis miring terbalik) harus antara 1 dan 253 (mengabaikan titik di akhir opsional jika ada).
  • Semua label (bagian dari nama antartitik) harus sepanjang 1 sampai 63 byte.
  • Nama yang tidak valid seperti .example.com, example..com, atau string kosong 400 Permintaan Buruk.
  • Karakter non-ASCII harus menggunakan punycoded (xn--qxam, bukan ελ).
jenis

string, default: 1

Jenis RR dapat direpresentasikan sebagai angka dalam [1, 65535] atau string kanonis (tidak peka huruf besar/kecil, seperti A atau aaaa). Anda dapat menggunakan 255 untuk 'SALAH SATU' tetapi perhatikan bahwa ini bukan pengganti untuk mengirim kueri untuk data A dan AAAA atau MX. Server nama otoritatif tidak perlu menampilkan semua catatan untuk kueri tersebut; beberapa tidak merespons, dan yang lainnya (seperti cloudflare.com) hanya menampilkan HINFO.

cd

boolean, default: false

Tanda CD (Pemeriksaan Dinonaktifkan). Gunakan cd=1 atau cd=true untuk menonaktifkan validasi DNSSEC; gunakan cd=0, cd=false, atau tanpa parameter cd untuk mengaktifkan validasi DNSSEC.

buah

string, default: kosong

Opsi jenis konten yang diinginkan. Gunakan ct=application/dns-message untuk menerima pesan DNS biner di isi HTTP respons, bukan teks JSON. Gunakan ct=application/x-javascript untuk meminta teks JSON secara eksplisit. Nilai jenis konten lainnya akan diabaikan dan konten JSON default akan ditampilkan.

cara

boolean, default: false

Penanda DO (DNSSEC OK). Menggunakan do=1, atau do=true untuk menyertakan data DNSSEC (RRSIG, NSEC, NSEC3); gunakan do=0, do=false, atau tanpa parameter do untuk menghilangkan data DNSSEC.

Aplikasi harus selalu menangani (dan mengabaikan, jika perlu) DNSSEC apa pun rekaman dalam respons JSON karena implementasi lain mungkin selalu menyertakannya, dan kami dapat mengubah perilaku default untuk respons JSON pada masa mendatang. (Respons pesan DNS biner selalu mengikuti nilai tanda DO.)

edns_client_subnet

string, default: kosong

Opsi edns0-client-subnet. Formatnya adalah alamat IP dengan subnet mask. Contoh: 1.2.3.4/24, 2001:700:300::/48.

Jika Anda menggunakan DNS-over-HTTPS karena masalah privasi, dan tidak ingin setiap bagian dari alamat IP Anda akan dikirim ke server nama yang kredibel untuk akurasi lokasi geografis, gunakan edns_client_subnet=0.0.0.0/0. Google Public DNS biasanya mengirimkan perkiraan informasi jaringan (biasanya membuat bagian terakhir dari alamat IPv4 Anda menjadi nol).

random_padding

string, diabaikan

Nilai parameter ini diabaikan. Contoh: XmkMw~o_mgP2pf.gpw-Oi5dK.

Klien API khawatir dengan kemungkinan serangan privasi side-channel menggunakan ukuran paket permintaan GET HTTPS dapat menggunakan ini untuk membuat semua permintaan ukuran yang sama dengan permintaan padding dengan data acak. Untuk mencegah salah penafsiran URL, batasi karakter padding terhadap karakter URL yang tidak dicadangkan: huruf besar dan kecil, angka, tanda hubung, titik, garis bawah, dan tanda gelombang.

Respons DNS di JSON

Respons yang berhasil (komentar yang ditambahkan di sini tidak ada dalam respons sebenarnya):

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

Lihat RFC 7871 (EDNS Client Subnet) untuk detail tentang “panjang awalan cakupan” dan pengaruhnya terhadap penyimpanan dalam cache.

Respons kegagalan dengan informasi diagnostik:

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

Data SPF dan TXT dengan kutipan yang disematkan dan atribusi server nama:

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

String DNS

Semua data TXT dienkode sebagai satu string JSON termasuk penggunaan TXT yang lebih panjang format rekaman seperti RFC 4408 (SPF) atau RFC 4871 (DKIM).

DNS

Mekanisme ekstensi EDNS umum tidak didukung. Opsi Subnet Klien EDNS (edns-client-subnet) adalah parameter di Permintaan GET dan kolom level teratas di respons JSON.