Trước đây, các ứng dụng dựa trên nền tảng web đòi hỏi phải có tiện ích trình duyệt để dùng các tính năng DNS nâng cao như DANE, khám phá dịch vụ DNS-SD hoặc thậm chí là để phân giải bất kỳ thứ gì khác ngoài địa chỉ IP, chẳng hạn như bản ghi MX. Để sử dụng các tính năng phụ thuộc vào DNSSEC như bản ghi SSHFP, mọi tiện ích như vậy đều phải tự xác thực DNSSEC, vì trình duyệt hoặc hệ điều hành có thể không làm như vậy.
Kể từ năm 2016, Google Public DNS đã cung cấp một API thân thiện với web cho DoH với quy trình xác thực DNSSEC không yêu cầu cấu hình hay tiện ích của trình duyệt hoặc hệ điều hành. Các tham số truy vấn GET và phản hồi JSON đơn giản cho phép ứng dụng phân tích cú pháp kết quả bằng các API web phổ biến và tránh được các chi tiết phức tạp về định dạng thông báo DNS như nén con trỏ cho tên miền.
Xem trang tài liệu chung về DoH để biết thông tin chung về DoH, chẳng hạn như tiêu đề HTTP, cách xử lý lệnh chuyển hướng, các phương pháp hay nhất về quyền riêng tư và mã trạng thái HTTP.
Trang Secure Transports (Di chuyển an toàn) có curl
ví dụ về dòng lệnh dành cho DoH, cũng như thông tin phổ biến cho DoH và DNS qua TLS (DoT), chẳng hạn như khả năng hỗ trợ TLS (Bảo mật tầng truyền tải) và cắt bớt DNS.
Thông số kỹ thuật của API JSON
Tất cả lệnh gọi API đều là yêu cầu HTTP GET. Trong trường hợp có các tham số trùng lặp, chỉ giá trị đầu tiên được sử dụng.
Các tham số được hỗ trợ
- tên
chuỗi, bắt buộc
Tham số bắt buộc duy nhất. Chấp nhận ký tự thoát dấu gạch chéo ngược RFC 4343.
- Độ dài (sau khi thay thế các ký tự thoát của dấu gạch chéo ngược) phải nằm trong khoảng từ 1 đến 253 (bỏ qua dấu chấm ở cuối nếu có).
- Tất cả các nhãn (các phần của tên giữa các dấu chấm) phải dài từ 1 đến 63 byte.
- Các tên không hợp lệ như
.example.com
,example..com
hoặc chuỗi trống sẽ nhận được 400 Yêu cầu không hợp lệ. - Các ký tự không phải ASCII nên là tùy thuộc vào chữ ký mã hóa (
xn--qxam
, chứ không phảiελ
).
- loại
chuỗi, mặc định:
1
Loại RR có thể được biểu thị dưới dạng số trong [1, 65535] hoặc một chuỗi chính tắc (không phân biệt chữ hoa chữ thường, chẳng hạn như
A
hoặcaaaa
). Bạn có thể dùng255
cho các truy vấn "BẤT KỲ" nào, nhưng xin lưu ý rằng đây không phải là phương thức thay thế để gửi truy vấn cho cả bản ghi A và AAAA hoặc MX. Máy chủ định danh đáng tin cậy không cần trả về tất cả bản ghi cho những truy vấn đó; một số máy chủ không phản hồi và các máy chủ định danh khác (chẳng hạn như cloudflare.com) chỉ trả về HINFO.- cd
boolean, mặc định:
false
Cờ CD (Đang kiểm tra đang tắt). Sử dụng
cd=1
hoặccd=true
để tắt tính năng xác thực DNSSEC; sử dụngcd=0
,cd=false
hoặc không có thông sốcd
để bật tính năng xác thực DNSSEC.- đơn vị
chuỗi, mặc định: trống
Tuỳ chọn loại nội dung mong muốn. Sử dụng
ct=application/dns-message
để nhận thông báo DNS nhị phân trong nội dung HTTP phản hồi thay vì văn bản JSON. Sử dụngct=application/x-javascript
để yêu cầu văn bản JSON một cách rõ ràng. Các giá trị loại nội dung khác sẽ bị bỏ qua và nội dung JSON mặc định sẽ được trả về.- do
boolean, mặc định:
false
Cờ DO (DNSSEC OK). Sử dụng
do=1
hoặcdo=true
để thêm các bản ghi DNSSEC (RRSIG, NSEC, NSEC3); sử dụngdo=0
,do=false
hoặc không có tham sốdo
để bỏ qua các bản ghi DNSSEC.Các ứng dụng phải luôn xử lý (và bỏ qua, nếu cần) mọi bản ghi DNSSEC trong phản hồi JSON vì các cách triển khai khác có thể luôn bao gồm cả các bản ghi đó, đồng thời chúng tôi có thể thay đổi hành vi mặc định cho các phản hồi JSON trong tương lai. (Phản hồi của thông báo DNS nhị phân luôn tuân theo giá trị của cờ DO.)
- edns_client_subnet
chuỗi, mặc định: trống
Tuỳ chọn edns0-client-subnet. Định dạng là một địa chỉ IP có mặt nạ mạng con. Ví dụ:
1.2.3.4/24
,2001:700:300::/48
.Nếu bạn đang dùng DNS-over-HTTPS vì vấn đề về quyền riêng tư và không muốn gửi bất kỳ phần địa chỉ IP nào đến máy chủ định danh đáng tin cậy để đảm bảo độ chính xác của vị trí địa lý, hãy sử dụng
edns_client_subnet=0.0.0.0/0
. DNS Google Public thường gửi thông tin mạng gần đúng (thường bỏ đi phần cuối của địa chỉ IPv4).- random_padding
chuỗi, bị bỏ qua
Giá trị của thông số này bị bỏ qua. Ví dụ:
XmkMw~o_mgP2pf.gpw-Oi5dK
Các ứng dụng API lo ngại về khả năng xảy ra các cuộc tấn công quyền riêng tư kênh bên bằng cách sử dụng kích thước gói của các yêu cầu GET HTTPS có thể sử dụng phương thức này để đưa ra tất cả các yêu cầu có cùng kích thước cho các yêu cầu khoảng đệm chứa dữ liệu ngẫu nhiên. Để tránh hiểu sai URL, hãy hạn chế các ký tự khoảng đệm trong các ký tự URL chưa được đặt trước: chữ cái viết hoa và viết thường, chữ số, dấu gạch nối, dấu chấm, dấu gạch dưới và dấu ngã.
Phản hồi DNS trong JSON
Phản hồi thành công (bình luận được thêm ở đây sẽ không xuất hiện trong phản hồi thực tế):
{
"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
}
Vui lòng xem RFC 7871 (Mạng con ứng dụng EDNS) để biết thông tin chi tiết về "độ dài tiền tố phạm vi" và mức độ ảnh hưởng của chỉ số này đến việc lưu vào bộ nhớ đệm.
Một phản hồi lỗi kèm theo thông tin chẩn đoán:
{
"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/."
}
Bản ghi SPF và TXT có trích dẫn được nhúng và thuộc tính máy chủ định danh:
{
"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
}
],
}
Chuỗi DNS
Tất cả bản ghi TXT đều được mã hoá dưới dạng một chuỗi JSON, bao gồm cả việc sử dụng các định dạng bản ghi TXT dài hơn như RFC 4408 (SPF) hoặc RFC 4871 (DKIM).
EDNS
Không hỗ trợ Cơ chế tiện ích EDNS chung. Tuỳ chọn Mạng con máy khách EDNS (edns-client-subnet) là một tham số trong yêu cầu GET và một trường cấp cao nhất trong phản hồi JSON.