בעבר, אפליקציות מבוססות-אינטרנט חייבו תוספים לדפדפן כדי להשתמש בתכונות DNS מתקדמות כמו DANE, זיהוי שירות DNS-SD ואפילו כדי לפתור כל דבר מלבד כתובות IP, כמו רשומות MX. כדי להשתמש בתכונות התלויות ב-DNSSEC, כמו רשומות SSHFP, אתם צריכים לאמת את תוספי ה-DNSSEC בעצמם, כי יכול להיות שהדפדפן או מערכת ההפעלה לא יוכלו לעשות זאת.
משנת 2016, ב-Google Public DNS יש ממשק API ידידותי לאינטרנט שמיועד ל-DoH, עם אימות DNSSEC, שלא דורש הגדרה או תוספים של הדפדפן או מערכת ההפעלה. פרמטרים פשוטים של שאילתות GET ותגובות JSON מאפשרים ללקוחות לנתח את התוצאות באמצעות ממשקי API נפוצים באינטרנט, ולהימנע מפרטי פורמט מורכבים של הודעות DNS, כמו דחיסת מצביע עבור שמות דומיינים.
בדף התיעוד הכללי של DoH תוכלו לקרוא מידע כללי על DoH, כמו כותרות HTTP, טיפול בהפניות אוטומטיות, שיטות מומלצות לשמירה על פרטיות וקודי סטטוס של HTTP.
בדף Secure Transports יש curl
דוגמאות לשורת הפקודה ל-DoH, ומידע שמשותף ל-DoH ול-DNS באמצעות TLS (DoT), כמו תמיכה ב-TLS וקיצור DNS.
מפרט JSON API
כל הקריאות ל-API הן בקשות HTTP GET. במקרה של פרמטרים כפולים, המערכת תשתמש רק בערך הראשון.
פרמטרים נתמכים
- name
מחרוזת, חובה
הפרמטר הנדרש היחיד. ניתן להשתמש בתו בריחה בקו נטוי הפוך לפי RFC 4343.
- האורך (אחרי שמחליפים תווי בריחה בקו נטוי הפוך) צריך להיות בין 1 ל-253 (אם יש נקודה בסוף, המערכת מתעלמת מהנקודה הזו).
- כל התוויות (חלקים מהשם בין הנקודות) חייבות להיות באורך של 1 עד 63 בייטים.
- שמות לא חוקיים כמו
.example.com
,example..com
או מחרוזת ריקה מקבלים 400 Bad Request. - תווים שאינם ASCII צריכים להיות punycoded (
xn--qxam
, ולאελ
).
- סוג
מחרוזת, ברירת מחדל:
1
אפשר לייצג את סוג ה-RR כמספר במחרוזת [1, 65535] או כמחרוזת קנונית (לא תלוית-רישיות, כמו
A
אוaaaa
). אפשר להשתמש בערך255
לשאילתות 'ANY', אבל חשוב לזכור שהאפשרות הזו לא תחליף לשליחת שאילתות גם לרשומות A וגם לרשומות AAAA או MX. שרתי שמות מהימנים לא צריכים להחזיר את כל הרשומות לשאילתות כאלה. חלקם לא מגיבים, ואחרים (כמו cloudflare.com) לא צריכים להחזיר רק HINFO.- cd
בוליאני, ברירת המחדל:
false
סימון התקליטור (בבדיקה מושבת). צריך להשתמש ב-
cd=1
או ב-cd=true
כדי להשבית את האימות של DNSSEC. כדי להפעיל אימות של DNSSEC, צריך להשתמש בפרמטרcd=0
אוcd=false
, או ללאcd
.- כמות
מחרוזת, ברירת מחדל: ריק
האפשרות הרצויה של סוג התוכן. באמצעות
ct=application/dns-message
, ניתן לקבל הודעת DNS בינארית בגוף ה-HTTP של התגובה במקום טקסט JSON. משתמשים ב-ct=application/x-javascript
כדי לבקש במפורש טקסט JSON. המערכת מתעלמת מערכים אחרים של סוגי תוכן, ומוחזר תוכן JSON שמוגדר כברירת מחדל.- do
בוליאני, ברירת המחדל:
false
סימון DO (DNSSEC OK). צריך להשתמש ב-
do=1
או ב-do=true
כדי לכלול רשומות DNSSEC (RRSIG , NSEC , NSEC3). צריך להשתמש בפרמטרdo=0
אוdo=false
או ללא הפרמטרdo
כדי להשמיט רשומות DNSSEC.אפליקציות תמיד צריכות לטפל ברשומות 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
. בדרך כלל, ה-DNS הציבורי של Google שולח נתונים משוערים לגבי הרשת (בדרך כלל מאפס את החלק האחרון של כתובת ה-IPv4 שלכם).- random_padding
מחרוזת, התעלמות
המערכת מתעלמת מהערך של הפרמטר הזה. דוגמה:
XmkMw~o_mgP2pf.gpw-Oi5dK
לקוחות API שמודאגים ממתקפות אפשריות על פרטיות בערוץ צדדי באמצעות גודלי החבילות של בקשות HTTPS GET יכולים להשתמש בהגדרה הזו כדי שכל הבקשות יהיו באותו גודל בדיוק, באמצעות בקשות מרווח פנימי עם נתונים אקראיים. כדי למנוע פירוש שגוי של כתובת ה-URL, כדאי להגביל את תווי המרווח הפנימי לתווי כתובת URL לא שמורים: אותיות רישיות וקטנות, ספרות, מקף, נקודה, קו תחתון וטילדה.
תגובת 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 Client Subnet) אפשר לקרוא פרטים על 'היקף קידומת' ועל האופן שבו הוא משפיע על שמירה במטמון.
תגובה במקרה של כשל עם פרטי אבחון:
{
"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' (edns-client-subnet) היא פרמטר בבקשת ה-GET ושדה ברמה העליונה בתגובת JSON.