Longitud de clave DKIM: 2048 bits no caben en una cadena DNS

Una clave DKIM de 1024 bits cabe en una sola cadena TXT del DNS. Una de 2048 no, y ese único hecho explica casi todo lo que sale mal cuando un dominio actualiza: el registro tiene que publicarse como varias cadenas entrecomilladas que un verificador vuelve a unir, y las herramientas que hay por medio no siempre colaboran. La clave que sale por el otro lado es más corta que la que generaste, y nada en tu flujo de correo te lo dice.

El RFC 8301 lo dijo en voz alta en 2018. Exige a los firmantes usar al menos 1024 bits y recomienda al menos 2048, y explica en el mismo documento por qué las claves más fuertes siguieron siendo raras: el software de aprovisionamiento de DNS que solo maneja una cadena de 255 bytes en un registro TXT no puede alojarlas.

La longitud de la clave es el valor p=, y solo el valor p=

Un registro DKIM es un registro TXT en <selector>._domainkey.<domain> que contiene una clave pública. La etiqueta p= la lleva, codificada en base64, y su longitud es la longitud de la clave. Nada más en el registro indica la fuerza: no hay etiqueta de bits, ni tamaño de algoritmo, ni campo que un panel de DNS pudiera enseñarte.

v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...

Para una clave RSA, p= contiene una estructura SubjectPublicKeyInfo: un contenedor anidado que lleva el identificador del algoritmo y después el módulo y el exponente. La longitud en bits es la anchura de ese módulo, y por eso leerla significa analizar la estructura en vez de medir la cadena.

Eso importa más de lo que parece, porque la longitud de la cadena y la longitud de la clave se separan en cuanto algo trunca el valor.

2048 bits no caben en una sola cadena del DNS

Un registro TXT del DNS se compone de cadenas de caracteres, cada una de 255 bytes como máximo. Los valores más largos se publican como varias cadenas entrecomilladas que un receptor concatena sin separador entre ellas. Medido sobre claves recién generadas, esto es lo que cuesta cada tamaño.

ClaveValor p= en base64Registro completoCadenas DNS necesarias
RSA 1024216 caracteres2341
RSA 2048392 caracteres4102
RSA 4096736 caracteres7543
Ed2551944 caracteres661

El registro de ejemplo del propio RFC 8463 publica una clave RSA en cuatro cadenas entrecomilladas, y un verificador las concatena sin nada en medio. Eso es DNS correcto, y un verificador lo maneja sin dificultad.

El fallo está antes del verificador. Un panel de aprovisionamiento que solo acepta una cadena se queda en silencio con los primeros 255 caracteres. Un panel que acepta el valor entero pero mete un espacio o un salto de línea donde estaban las comillas produce un base64 con un carácter que no pertenece al alfabeto. Una exportación y reimportación por fichero de zona puede perder el entrecomillado entero. Todos estos casos producen un registro que sigue empezando por v=DKIM1; k=rsa; p= y sigue viéndose bien en un navegador.

Una clave truncada se lee como un 2048 rotundo si te fías del registro

Esta es la parte que conviene cuidar, porque decide si un comprobador sirve de algo.

La longitud de un módulo RSA se declara dentro de la estructura de la clave. Un lector que se fía de la longitud declarada encuentra la cabecera del módulo, lee el número de bytes que dice tener e informa del tamaño que representarían esos bytes. Si el valor quedó cortado después de esa cabecera, la longitud declarada sigue valiendo 2048 bits aunque los bytes no estén, así que el lector responde "2048" sin dudarlo. Corta una clave real en cada desplazamiento de byte y la inmensa mayoría de esos cortes se informan como una clave intacta del tamaño previsto.

Nuestro propio comprobador DKIM exige que cada longitud anidada de la estructura termine exactamente donde termina su contenedor. Una clave truncada en cualquier punto, o con basura al final, no se puede analizar en vez de informar de un tamaño menor o del previsto, y una clave inanalizable se informa como un fallo y no como una clave ausente. Una clave que no verifica nada y una clave que no está publicada son problemas distintos con soluciones distintas, y un comprobador que los informa igual te manda al sitio equivocado.

En los dominios que probamos para el Unspam 2026 Email Deliverability Benchmark, el 90% firma con una clave DKIM que funciona, así que esto no es un hueco de adopción. Es una categoría de rotura silenciosa dentro de ese 90%.

Un p= vacío es una revocación, no una clave ausente

v=DKIM1; k=rsa; p= sin nada detrás del signo igual es un registro válido, y significa que la clave ha sido revocada. El RFC 6376 lo define así a propósito, para que una clave comprometida pueda retirarse sin borrar el registro y dejar a los verificadores adivinando si el nombre simplemente no resolvió.

Trata la diferencia como real. Un selector revocado es una decisión que tomó alguien; un selector ausente es un despliegue que no se terminó. Se parecen muchísimo en una consulta DNS y piden respuestas opuestas.

Lo mismo vale para una rotación. Los selectores existen para que un dominio pueda llevar varias claves a la vez, y que s1._domainkey y s2._domainkey estén vivos juntos es la forma de rotar sin hueco. La firma nombra el selector que usó y un verificador consulta solo ese, así que publicar la clave nueva antes de cambiar el firmante es el orden seguro, y quitar la vieja antes de que se haya entregado el último mensaje firmado con ella es el orden peligroso.

Las claves Ed25519 son 32 bytes en crudo, no una estructura de clave

El RFC 8463 añadió la firma Ed25519, y el registro para ella no tiene la forma del de RSA. Con k=ed25519, el valor p= es la clave pública de 32 bytes en crudo, no un SubjectPublicKeyInfo, y por eso se codifica en 44 caracteres base64 y siempre cabe en una cadena del DNS.

La consecuencia práctica es que cualquier otra longitud no es una clave. Un fragmento de 30 bytes, un valor truncado o una clave RSA entera olvidada bajo una etiqueta ed25519 son todos inservibles, y un comprobador que informa "Ed25519, presente" ante cualquier valor no vacío no te dice nada. Verifica la longitud, no la presencia.

La adopción sigue siendo lo bastante escasa como para que Ed25519 se publique normalmente junto a RSA y no en su lugar, porque un verificador que no lo admite trata la firma como no verificable en vez de recurrir a la otra.

t=y hace que la firma no cuente para nada, sea cual sea la clave

La etiqueta t lleva banderas, y t=y significa que el dominio está en pruebas. El RFC 6376 le dice a un verificador que "MUST NOT treat messages from Signers in testing mode differently from unsigned email", que es más fuerte que ignorar los fallos: la firma no aporta absolutamente nada, así que DKIM no puede alinearse, y un dominio que depende de la alineación DKIM no obtiene ningún pase de DKIM mientras la bandera esté puesta.

Las banderas de prueba deberían quitarse al final de un despliegue, y muchas veces no se quitan. Si un dominio publica una clave perfecta de 2048 bits, firma todos los mensajes y aun así acumula fallos de DMARC que no se explica, revisa esta etiqueta antes que nada.

La otra bandera de la misma etiqueta es más discreta. t=s prohíbe que la identidad firmante sea un subdominio de d=, lo cual es un endurecimiento deliberado y no un defecto, y también es la diferencia entre un firmante que funciona y uno que deja de funcionar el día que alguien apunta un subdominio a la misma clave.

Qué comprobar en una clave que ya publicaste

Seis comprobaciones, en el orden que encuentra problemas más rápido.

  1. Que la clave se pueda analizar. No que exista un registro en el selector, sino que el valor de dentro sea una clave completa. Esta es la comprobación que caza una actualización truncada.
  2. Que la fuerza sea de al menos 1024 y preferiblemente 2048. Por debajo de 1024 un verificador no debe tratar la firma como válida; entre 1024 y 2048 es válida y está por debajo de lo que recomienda el RFC 8301.
  3. Que p= no esté vacío, salvo que lo revocaras a propósito.
  4. Que no haya t=y. Si el despliegue terminó, la bandera de pruebas debería haber desaparecido.
  5. Que cada plataforma que envía como tú tenga su propio selector vivo. Tu ESP, tu CRM, tu servicio de soporte y tu herramienta de facturación publican uno cada uno, y los añaden personas distintas en momentos distintos.
  6. Que el selector de la firma resuelva. Una clave publicada bajo un nombre que el firmante no usa es invisible.

Que DKIM pase es necesario y no suficiente, porque DMARC necesita que el dominio firmante se alinee con la dirección de tu cabecera From, y un mensaje puede ir firmado a la perfección por el dominio propio de una plataforma y aun así fallar. Nuestra guía sobre firmas DKIM cubre el formato del registro, nuestra guía sobre autenticación del correo cubre cómo dependen unos de otros los tres registros, y la misma forma de fallo silencioso en el lado de SPF es el tema de nuestra guía sobre el mecanismo include de SPF.

Para ver la clave que lee de verdad un receptor, junto al resultado de la firma en un mensaje real, haz una prueba de spam gratis.

Preguntas frecuentes

¿Qué longitud debe tener una clave DKIM?

Al menos 1024 bits y preferiblemente 2048. El RFC 8301 exige a los firmantes claves RSA de al menos 1024 bits y dice que deberían usar al menos 2048, y obliga a los verificadores a rechazar como inválidas las firmas hechas con claves por debajo de 1024. Una clave entre 1024 y 2048 bits sigue verificando, así que es un aviso y no un fallo, pero está por debajo de lo que recomienda la especificación. Los verificadores deben poder validar claves de 1024 hasta 4096 bits.

¿Por qué se rompió mi correo al actualizar la clave DKIM a 2048 bits?

Porque una clave de 2048 bits no cabe en una sola cadena de caracteres del DNS. Un registro TXT se construye con cadenas de 255 bytes como máximo, y el registro entero de una clave de 2048 bits llega a unos 410 caracteres, así que tiene que publicarse como dos cadenas entrecomilladas que un verificador une sin nada en medio. El software de aprovisionamiento que solo maneja una cadena se queda con los primeros 255 caracteres, y el que reformatea el entrecomillado puede meter un espacio o un salto de línea dentro del base64. En ambos casos el registro sigue empezando por v=DKIM1 y sigue pareciendo correcto.

¿Cuántas cadenas DNS necesita una clave DKIM?

Medido sobre claves recién generadas, el valor p= en base64 ocupa 216 caracteres con RSA 1024, 392 con RSA 2048 y 736 con RSA 4096, y las etiquetas de delante añaden otros 18. Eso deja el registro entero en 234, 410 y 754 caracteres, que necesitan una, dos y tres cadenas DNS respectivamente. Una clave Ed25519 son 44 caracteres de base64 y 66 en total, así que siempre cabe en una.

¿Puede un comprobador DKIM distinguir una clave truncada de una válida?

Solo si se niega a fiarse de la longitud declarada. El tamaño de un módulo RSA se indica dentro de la estructura de la clave, así que un lector que encuentra la cabecera y la cree informa del tamaño previsto aunque los bytes posteriores estén cortados. Cortar una clave real en cada desplazamiento de byte produce una respuesta del tamaño previsto en la inmensa mayoría de los cortes. Exigir que cada longitud anidada termine exactamente donde termina su contenedor es lo que convierte un truncamiento en inanalizable en vez de en corto, y una clave inanalizable es un fallo y no una clave ausente.

¿Qué significa un p= vacío en un registro DKIM?

Significa que la clave ha sido revocada, no que el registro esté incompleto. El RFC 6376 define así el valor p= vacío a propósito, para que una clave comprometida pueda retirarse sin borrar el registro y dejar a los verificadores sin poder distinguir una retirada de un nombre que no resolvió. Un selector revocado es una decisión que tomó alguien y un selector ausente es un despliegue que no se terminó, y piden respuestas opuestas.

¿Es mejor una clave DKIM Ed25519 que una RSA?

Es más corta y siempre cabe en una cadena del DNS, lo que elimina toda la clase de problema del truncamiento, pero el soporte no es universal. Un verificador que no implementa Ed25519 trata la firma como no verificable en vez de recurrir a otra, así que normalmente se publica junto a RSA y no en su lugar. El registro además tiene otra forma: con k=ed25519 el valor p= es la clave pública de 32 bytes en crudo, no un SubjectPublicKeyInfo, así que cualquier otra longitud no es una clave utilizable.

Descubre dónde acaba realmente tu campaña.

Empieza una prueba antispam gratis Prueba de Inbox Placement