JSON API untuk DNS melalui HTTPS (DoH)

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

Sejak 2016, Google Public DNS telah menawarkan API yang cocok untuk web untuk DoH dengan validasi DNSSEC yang tidak memerlukan konfigurasi atau ekstensi browser atau OS. Parameter kueri GET sederhana dan respons JSON memungkinkan klien untuk mengurai hasil 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 Transportasi Aman memiliki contoh command line curl untuk DoH, serta informasi yang umum untuk DoH dan DNS melalui TLS (DoT), seperti dukungan TLS dan pemotongan DNS.

Spesifikasi JSON API

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

Parameter yang didukung

name

string, wajib diisi

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

  • Panjangnya (setelah mengganti escape garis miring terbalik) harus antara 1 dan 253 (mengabaikan titik akhir opsional jika ada).
  • Semua label (bagian dari nama antara titik) harus memiliki panjang 1 hingga 63 byte.
  • Nama tidak valid seperti .example.com, example..com, atau string kosong mendapatkan 400 Bad Request.
  • Karakter non-ASCII harus menggunakan punycoded (xn--qxam, bukan ελ).
tipe

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 kueri 'ANY', tetapi perlu diketahui bahwa ini bukan pengganti untuk mengirim kueri untuk data A dan AAAA atau MX. Server nama otoritatif tidak perlu menampilkan semua data untuk kueri tersebut; beberapa tidak merespons, dan yang lainnya (seperti cloudflare.com) hanya menampilkan HINFO.

cd

boolean, default: false

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

buah

string, default: kosong

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

do

boolean, default: false

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

Aplikasi harus selalu menangani (dan mengabaikan, jika perlu) setiap data DNSSEC dalam respons JSON, karena implementasi lain mungkin selalu menyertakannya, dan kami dapat mengubah perilaku default untuk respons JSON di masa mendatang. (Respons pesan DNS biner selalu menghormati nilai dari flag DO.)

edns_client_subnet

string, default: kosong

Opsi edns0-client-subnet. Format 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 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 nol bagian terakhir dari alamat IPv4 Anda).

random_padding

string, diabaikan

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

Klien API yang khawatir dengan kemungkinan serangan privasi side-channel menggunakan ukuran paket permintaan GET HTTPS dapat menggunakan ini untuk membuat semua permintaan berukuran sama persis dengan permintaan padding dengan data acak. Untuk mencegah salah penafsiran URL, batasi karakter padding untuk 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 (Subnet Klien EDNS) untuk mengetahui detail tentang “panjang awalan cakupan” dan pengaruhnya terhadap penyimpanan 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 string JSON tunggal termasuk penggunaan format data TXT yang lebih panjang seperti RFC 4408 (SPF) atau RFC 4871 (DKIM).

DNS

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