API de JSON para DNS por HTTPS (DoH)

Antes, las aplicaciones basadas en la Web requerían que las extensiones del navegador usaran extensiones funciones de DNS, como DANE, descubrimiento de servicios DNS-SD, o incluso para resolver y cualquier cosa, excepto direcciones IP, como registros MX. Para usar funciones que dependen de DNSSEC, como los registros SSHFP, cualquiera de esas extensiones tendrían que validar las DNSSEC, ya que es posible que el navegador o el SO no lo hagan.

Desde 2016, el DNS público de Google ha ofrecido una API compatible con la Web para DoH con DNSSEC de seguridad que no requiere extensiones ni configuración del SO o del navegador. Los parámetros de consulta GET y las respuestas JSON simples permiten que los clientes analicen resultados con APIs web comunes y evitar detalles complejos de formatos de mensajes DNS, como compresión de puntero para nombres de dominio.

Consulta la página de documentación general del DoH para obtener información sobre el DoH. generalmente, como encabezados HTTP, manejo de redireccionamientos, prácticas recomendadas de privacidad y Códigos de estado HTTP

La página Transporte seguro (Secure Transports) tiene Ejemplos de la línea de comandos de curl para el DoH y la información común al DoH y el DNS a través de TLS (DoT), como compatibilidad con TLS y truncamiento de DNS.

Especificación de la API de JSON

Todas las llamadas a la API son solicitudes HTTP GET. En el caso de los parámetros duplicados, solo se usa el primer valor.

Parámetros admitidos

nombre

string, obligatoria

Es el único parámetro obligatorio. Se aceptan los caracteres de escape de barra inversa RFC 4343.

  • La longitud (después de reemplazar los caracteres de escape de barra inversa) debe estar entre 1 y 253 (ignorando un punto final opcional si está presente).
  • Todas las etiquetas (partes del nombre entre puntos) deben tener entre 1 y 63 bytes.
  • Nombres no válidos, como .example.com, example..com o string vacía get Error 400: Solicitud incorrecta.
  • Los caracteres que no son ASCII deben estar punycoded (xn--qxam, no ελ).
tipo

cadena, valor predeterminado: 1

El tipo de RR se puede representar como un número en [1, 65535] o una cadena canónica (no distingue mayúsculas de minúsculas, como A o aaaa). Puedes usar 255 para "CUALQUIERA" pero ten en cuenta que este no es un reemplazo para enviar consultas tanto para los registros A y AAAA o MX. Los servidores de nombres autorizados no necesitan mostrar todos los registros para esas consultas. algunos no responden y otros (como cloudflare.com) solo devuelven HINFO

cd

booleano, predeterminado: false

La marca de CD (marca de verificación inhabilitada). Usa cd=1 o cd=true para inhabilitar la validación de DNSSEC. usa cd=0, cd=false o no usa el parámetro cd para habilitar la validación de DNSSEC.

cant.

cadena, valor predeterminado: vacío

Opción de tipo de contenido deseado. Usa ct=application/dns-message para recibir un mensaje DNS binario en el HTTP en lugar de texto JSON. Usa ct=application/x-javascript para solicitar de forma explícita texto JSON. Se ignoran otros valores de tipo de contenido y se muestra el contenido JSON predeterminado.

hacer

booleano, predeterminado: false

La marca SÍ (DNSSEC OK). Usa do=1 o do=true para incluir registros DNSSEC (RRSIG, NSEC, NSEC3). Usa do=0, do=false o ningún parámetro do para omitir los registros DNSSEC.

Las aplicaciones siempre deben administrar (e ignorar, si es necesario) las DNSSEC registros en las respuestas JSON, ya que otras implementaciones siempre pueden incluirlas, y es posible que cambiemos el comportamiento predeterminado de las respuestas JSON en el futuro. (Las respuestas de mensajes DNS binarios siempre respetan el valor de la marca DO).

edns_client_subnet

cadena, valor predeterminado: vacío

La opción edns0-client-subnet. El formato es una dirección IP con una máscara de subred. Ejemplos: 1.2.3.4/24, 2001:700:300::/48.

Si estás usando DNS-over-HTTPS por cuestiones de privacidad y no quieres cualquier parte de su dirección IP que se envíe a los servidores de nombres autorizados para la precisión de la ubicación geográfica, usa edns_client_subnet=0.0.0.0/0. El DNS público de Google normalmente envía información de red aproximada (por lo general, se pone a cero la última parte de la dirección IPv4).

random_padding

string, ignorado

Se ignora el valor de este parámetro. Ejemplo: XmkMw~o_mgP2pf.gpw-Oi5dK.

A los clientes de APIs preocupados por posibles ataques a la privacidad en el canal lateral usando las los tamaños de paquetes de solicitudes GET de HTTPS pueden usar esto para hacer que todas las solicitudes se realicen con exactitud del mismo tamaño rellenando las solicitudes con datos aleatorios. Para evitar que se malinterprete la URL, restringe los caracteres de padding a los caracteres de URL sin reservar: letras mayúsculas y minúsculas, dígitos, guiones, puntos, guiones bajos y virgulillas.

Respuesta DNS en JSON

Una respuesta correcta (los comentarios agregados aquí no están presentes en las respuestas reales):

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

Consulta RFC 7871 (Subred de cliente de EDNS) para detalles sobre el “alcance de la longitud del prefijo” y cómo afecta el almacenamiento en caché.

Una respuesta de falla con información de diagnóstico:

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

Registros SPF y TXT con comillas incorporadas y atribución del servidor de nombres:

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

Cadenas DNS

Todos los registros TXT se codifican como una sola string JSON, incluidos los usos de TXT más largos. los formatos de registro, como RFC 4408 (SPF) o RFC 4871 (DKIM).

EDNS

No se admite el mecanismo de extensión de EDNS general. La opción Subred de cliente de EDNS (edns-client-subnet) es un parámetro del GET y un campo de nivel superior en la respuesta JSON.