Ir al contenido principal

Solución de problemas DANE/TLSA: diagnosticar y corregir los errores comunes

Por CaptainDNS
Publicado el 23 de febrero de 2026

Solución de problemas DANE/TLSA: diagnosticar y corregir los errores comunes con dig, openssl y Postfix
TL;DR
  • Los 5 errores DANE más comunes: DNSSEC ausente, hash TLSA obsoleto, nombre DNS incorrecto, STARTTLS mal configurado, propagación incompleta
  • Comandos esenciales: dig +dnssec, openssl s_client -starttls smtp, postfix/smtpd[]: TLS en los logs
  • La renovación del certificado Let's Encrypt es la causa nº1 de los fallos DANE en producción
  • Nuestro DANE TLSA Checker identifica automáticamente estos problemas
  • Los informes TLS-RPT (RFC 8460) señalan los fallos DANE antes de que tus corresponsales te alerten

Has desplegado DANE/TLSA en tu servidor de correo siguiendo las buenas prácticas, todo funcionaba, y un día los emails empiezan a ser rechazados por ciertos destinatarios. El mensaje de error menciona "failed DANE validation" o "TLSA record not found", pero los logs no te dicen exactamente qué ha cambiado.

Este escenario es el día a día de los administradores DANE. La dificultad no está en la complejidad del protocolo, sino en la cantidad de componentes implicados: DNSSEC, certificado TLS, registro TLSA, configuración MTA. Un solo eslabón defectuoso basta para romper toda la cadena.

Esta guía cubre los 5 errores DANE/TLSA más frecuentes con, para cada uno, el síntoma, los comandos de diagnóstico y la corrección. Está dirigida a administradores de sistemas y DevOps que ya tienen una configuración DANE operativa. Si aún no has desplegado DANE, empieza por el primer artículo de esta serie (consulta "Guías relacionadas" al final de la página).

Metodología en 5 pasos para identificar la causa de un fallo de validación DANE
  1. Lo primero que debes comprobar es el estado DNSSEC de tu zona. Sin DNSSEC válido, los registros TLSA son ignorados por los servidores emisores. Usa dig con el flag +dnssec para verificar que las firmas están presentes y son válidas:

    dig +dnssec MX captaindns.com
    dig +dnssec A mail.captaindns.com
    

    El flag ad (Authenticated Data) en la respuesta confirma que DNSSEC es válido. Si este flag está ausente, el problema está en DNSSEC, no en TLSA. Verifica también que la cadena de confianza esté completa con delv:

    delv @8.8.8.8 mail.captaindns.com A +rtrace
    
  2. Verifica que el TLSA esté publicado en el lugar correcto y contenga los valores adecuados. El nombre DNS debe corresponder al hostname MX, no al dominio:

    dig TLSA _25._tcp.mail.captaindns.com +short
    

    La respuesta debe contener los 4 campos: usage, selector, matching type y hash. Si la consulta no devuelve nada, el TLSA está publicado con un nombre DNS incorrecto o no existe.

  3. Obtén el certificado presentado por el servidor y calcula su hash para compararlo con el TLSA publicado:

    # Recuperar el certificado a través de STARTTLS
    openssl s_client -connect mail.captaindns.com:25 \
      -starttls smtp -servername mail.captaindns.com \
      2>/dev/null | openssl x509 -outform DER \
      | openssl dgst -sha256
    

    Para un TLSA con selector SPKI (1), calcula el hash de la clave pública:

    openssl s_client -connect mail.captaindns.com:25 \
      -starttls smtp -servername mail.captaindns.com \
      2>/dev/null | openssl x509 -pubkey -noout \
      | openssl pkey -pubin -outform DER \
      | openssl dgst -sha256
    

    Compara el resultado con el hash del TLSA. Si los valores difieren, el certificado fue renovado sin actualizar el TLSA.

  4. Verifica que el servidor ofrezca correctamente STARTTLS en el puerto 25:

    openssl s_client -connect mail.captaindns.com:25 \
      -starttls smtp -verify 5 \
      -servername mail.captaindns.com
    

    Comprueba que el certificado devuelto corresponda al hostname MX y que la cadena de certificados esté completa. Un certificado expirado o un hostname incorrecto provoca un fallo DANE incluso si el hash TLSA es correcto.

  5. Los logs de Postfix contienen los detalles de los fallos DANE. Filtra las entradas relevantes:

    grep "dane" /var/log/mail.log | grep -i "fail\|error\|unusable"
    

    Los informes TLS-RPT (si están configurados) señalan los fallos detectados por los servidores emisores. Busca los campos failure-type que contengan dane-required o tlsa-invalid en los informes JSON recibidos por email.

Los 5 errores DANE más comunes

Los problemas DANE se clasifican en 5 categorías. Cada sección a continuación describe el síntoma observable, el comando de diagnóstico y la corrección.

Árbol de decisión para diagnosticar los errores DANE/TLSA

Error 1: DNSSEC no firmado o firma expirada

Síntoma: los servidores emisores reportan "DANE required but not available" o "no DNSSEC" en los informes TLS-RPT. Los emails se entregan en modo oportunista (sin verificación DANE) o son rechazados.

Diagnóstico:

# Verificar el flag AD (Authenticated Data)
dig +dnssec MX captaindns.com | grep flags
# Resultado esperado: flags: qr rd ra ad

# Verificar la validez de las firmas RRSIG
dig +dnssec SOA captaindns.com | grep RRSIG
# La fecha de expiración está en el campo RRSIG

Causas frecuentes:

  • El registrar desactivó DNSSEC tras una transferencia de dominio
  • Las claves DNSSEC (KSK/ZSK) expiraron sin rotación automática
  • El DS record en el registrar ya no corresponde a la DNSKEY activa

Corrección: verifica que el DS record en tu registrar corresponda a tu DNSKEY. Si usas Bind9, comprueba las fechas de expiración de las claves con dnssec-settime y configura la rotación automática.

Error 2: hash TLSA obsoleto tras la renovación del certificado

Síntoma: "TLSA validation failed" o "certificate mismatch" en los logs. Este error aparece típicamente entre 60 y 90 días después del despliegue inicial, en la primera renovación de Let's Encrypt.

Diagnóstico:

# Hash del certificado activo (selector 0: Full cert)
openssl s_client -connect mail.captaindns.com:25 \
  -starttls smtp 2>/dev/null \
  | openssl x509 -outform DER \
  | openssl dgst -sha256

# Hash publicado en el DNS
dig TLSA _25._tcp.mail.captaindns.com +short
# Comparar los 64 caracteres hexadecimales

Causas frecuentes:

  • El hook de renovación de Certbot no actualiza el TLSA
  • El selector es Full (0) en vez de SPKI (1): cada renovación cambia el hash
  • El usage es DANE-EE (3) sin --reuse-key en Certbot

Corrección:

  • Solución rápida: genera el nuevo hash con nuestro DANE TLSA Generator y actualiza el DNS
  • Solución duradera: usa SPKI selector (1) con --reuse-key en Certbot, o pasa a DANE-TA (2) con el certificado CA de Let's Encrypt. Consulta nuestro tutorial Postfix/Bind/Let's Encrypt (artículo 2 de esta serie) para la configuración del hook de renovación automática

Error 3: TLSA publicado con un nombre DNS incorrecto

Síntoma: "no TLSA records found" aunque hayas creado el registro. Es el error más común entre los principiantes de DANE.

Diagnóstico:

# Encontrar el hostname MX
dig MX captaindns.com +short
# Resultado: 10 mail.captaindns.com.

# Verificar el TLSA en el lugar correcto (hostname MX)
dig TLSA _25._tcp.mail.captaindns.com +short

# Error típico: TLSA publicado en el dominio en lugar del MX
dig TLSA _25._tcp.captaindns.com +short
# Este TLSA es IGNORADO por los servidores emisores

Causa: confusión entre el dominio (captaindns.com) y el hostname MX (mail.captaindns.com). El TLSA debe publicarse en _25._tcp.<hostname-MX>, conforme a la RFC 7672 sección 2.1.1.

Corrección: publica el TLSA en _25._tcp.mail.captaindns.com (o el hostname que devuelve tu registro MX). Si tu dominio tiene varios MX, cada hostname debe tener su propio TLSA.

Error 4: STARTTLS no disponible o mal configurado

Síntoma: DANE está configurado en el DNS pero el servidor no ofrece STARTTLS, o el certificado presentado no corresponde al hostname. Los logs muestran "TLS handshake failed" o "certificate hostname mismatch".

Diagnóstico:

# Probar si STARTTLS es ofrecido
openssl s_client -connect mail.captaindns.com:25 \
  -starttls smtp -verify 5

# Verificar el Common Name y los SAN del certificado
openssl s_client -connect mail.captaindns.com:25 \
  -starttls smtp 2>/dev/null \
  | openssl x509 -noout -subject -ext subjectAltName

Causas frecuentes:

  • smtpd_tls_cert_file apunta a un archivo incorrecto en Postfix
  • El certificado no contiene el hostname MX en sus Subject Alternative Names
  • El firewall bloquea STARTTLS o el puerto 25 no es accesible en TLS

Corrección: en Postfix, verifica que smtpd_tls_security_level esté como mínimo en may y que las rutas de los certificados sean correctas:

# /etc/postfix/main.cf
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.captaindns.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.captaindns.com/privkey.pem
smtpd_tls_security_level = may

Matriz de errores DANE/TLSA: síntoma, causa y solución

Error 5: propagación DNS incompleta

Síntoma: DANE funciona de forma intermitente. Algunos servidores emisores validan el TLSA, otros reportan un error. El problema suele aparecer tras una actualización DNS reciente.

Diagnóstico:

# Comparar las respuestas entre servidores NS
dig TLSA _25._tcp.mail.captaindns.com @ns1.captaindns.com +short
dig TLSA _25._tcp.mail.captaindns.com @ns2.captaindns.com +short

# Verificar el TTL restante
dig TLSA _25._tcp.mail.captaindns.com +noall +answer

Causas frecuentes:

  • Transferencia de zona incompleta entre servidores DNS primario y secundario
  • TTL elevado en el registro anterior (las cachés DNS conservan el valor antiguo)
  • Un servidor NS no responde o devuelve una versión obsoleta de la zona

Corrección: verifica que todos tus servidores NS devuelvan el mismo valor TLSA. Si acabas de actualizar el TLSA, espera a que expire el TTL anterior antes de eliminar el registro antiguo. Para las rotaciones de certificado, publica el nuevo TLSA 2x TTL antes de la rotación efectiva.

Monitorizar DANE en producción

Corregir un error puntual no es suficiente. Los 3 mecanismos de monitorización siguientes previenen los incidentes recurrentes.

TLS-RPT: activa los informes TLS-RPT (RFC 8460) para recibir las notificaciones de fallos DANE por parte de los servidores emisores. El campo failure-type en el informe JSON indica con precisión el tipo de error:

failure-type TLS-RPTSignificadoAcción
dane-requiredTLSA exigido pero ausenteVerificar publicación TLSA
tlsa-invalidTLSA presente pero inválidoVerificar hash y sintaxis
dnssec-invalidFirma DNSSEC inválidaVerificar claves DNSSEC
certificate-expiredCertificado TLS expiradoRenovar el certificado
starttls-not-supportedSin STARTTLSVerificar config Postfix

Monitorización del certificado: configura una alerta 14 días antes de la expiración del certificado TLS. La renovación de Let's Encrypt se hace automáticamente, pero el hook TLSA puede fallar silenciosamente.

Verificación automática: programa una verificación diaria con nuestro DANE TLSA Syntax Checker o un script cron que compare el hash publicado con el certificado activo:

#!/bin/bash
# Verificación diaria DANE
TLSA_HASH=$(dig TLSA _25._tcp.mail.captaindns.com +short | awk '{print $4}')
CERT_HASH=$(openssl s_client -connect mail.captaindns.com:25 \
  -starttls smtp 2>/dev/null \
  | openssl x509 -pubkey -noout \
  | openssl pkey -pubin -outform DER \
  | openssl dgst -sha256 | awk '{print $2}')

if [ "$TLSA_HASH" != "$CERT_HASH" ]; then
  echo "ALERTA: el hash TLSA diverge del certificado activo" | \
    mail -s "DANE TLSA mismatch" admin@captaindns.com
fi

Plan de acción recomendado

  1. Diagnosticar: usa la metodología en 5 pasos anterior o nuestro DANE TLSA Checker para identificar el problema
  2. Identificar: clasifica el error en una de las 5 categorías (DNSSEC, hash, nombre DNS, STARTTLS, propagación)
  3. Corregir: aplica la solución correspondiente con los comandos proporcionados
  4. Verificar: prueba la corrección con dig +dnssec y openssl s_client antes de dar el problema por resuelto
  5. Prevenir: implementa TLS-RPT, la monitorización del certificado y la verificación automática

FAQ

¿Por qué la validación DANE falla tras la renovación del certificado?

La renovación genera un nuevo par de claves (salvo si --reuse-key está activado en Certbot). El hash en el registro TLSA ya no corresponde al nuevo certificado. Dos soluciones: usar SPKI selector (1) con --reuse-key para conservar la misma clave pública entre renovaciones, o pasar a DANE-TA (2) con el certificado de la autoridad de certificación Let's Encrypt, que no cambia con cada renovación.

¿Cómo corregir el error 'no TLSA records found'?

Este error significa que el TLSA está ausente del DNS o publicado en el lugar incorrecto. El TLSA debe publicarse en _25._tcp.&lt;hostname-MX&gt;, no en _25._tcp.&lt;dominio&gt;. Verifica con dig MX captaindns.com cuál es el hostname MX y después publica el TLSA con el nombre correcto. Si el TLSA existe, verifica que DNSSEC esté activo, ya que los resolvedores ignoran los TLSA sin DNSSEC.

¿Funciona DANE si DNSSEC está firmado en el dominio pero no en el hostname MX?

DNSSEC debe estar firmado en la zona que contiene el TLSA. Si tu hostname MX es mail.captaindns.com y el TLSA está en esa misma zona, entonces esa zona debe tener DNSSEC activo. La zona del dominio emisor no necesita DNSSEC. En cambio, si el MX apunta a un hostname en otra zona (alojamiento compartido), es esa zona la que debe tener DNSSEC.

¿Cómo depurar DANE con los logs de Postfix?

Activa el nivel de log TLS en Postfix con smtp_tls_loglevel = 2 (saliente) o smtpd_tls_loglevel = 2 (entrante) en main.cf. Las líneas que contienen Verified TLS connection confirman un éxito. Las líneas con dane y unusable o failed indican un fallo. Busca también DANE TLSA en los logs para ver los detalles de la verificación.

¿Qué significa 'DANE required but TLSA absent' en un informe TLS-RPT?

Este mensaje indica que el servidor emisor detectó una política DANE (a través de DNSSEC en la zona MX) pero no encontró un registro TLSA. O bien el TLSA aún no está publicado, o está en un nombre DNS incorrecto, o el resolvedor del servidor emisor aún no ha propagado la actualización. Verifica la publicación con dig TLSA _25._tcp.mail.captaindns.com desde un resolvedor externo.

¿El hash TLSA es correcto pero la validación falla, por qué?

Varias causas posibles: el selector en el TLSA (Full vs SPKI) no corresponde al método de hash utilizado, el certificado intermedio falta en la cadena presentada por el servidor, o el matching type (SHA-256 vs SHA-512) no corresponde al hash publicado. Verifica los 3 primeros campos del TLSA (usage, selector, matching type) y recalcula el hash con los parámetros correctos.

¿Cómo probar DANE sin arriesgar la pérdida de emails?

Publica primero el TLSA con un TTL bajo (300 segundos) y verifícalo con dig y nuestro DANE TLSA Checker. Prueba el envío desde un servidor DANE-aware (Gmail, Microsoft 365) hacia tu dominio. Si la validación falla, corrige el TLSA. Los servidores emisores conformes a la RFC 7672 sección 2.2 vuelven al modo oportunista si el TLSA es inválido, salvo si su política impone DANE estricto. Aumenta el TTL una vez validada la configuración.

📚 Guías de DANE/TLSA relacionadas

Fuentes

Artículos relacionados