En corto
| |
Sale el valor listo para pegar en el proveedor de DNS, dos cadenas entre comillas separadas por un espacio:
| |
Las dos van en el mismo registro TXT. Quien verifica DKIM las concatena sin espacios. Si el texto te lo dio Google Workspace o Microsoft 365 y no tienes la llave privada, es lo mismo sin el openssl: echo "<valor>" | fold -w 255 | sed 's/.*/"&"/' | paste -sd' ' -.
El problema
Un registro TXT se compone de una o más character-strings y cada una tiene un tope de 255 bytes (RFC 1035). El registro entero puede ser mucho más largo; lo que no puede es tener una sola cadena de 410 caracteres.
| Llave RSA | Largo de p= | Con v=DKIM1; k=rsa; p= | ¿Cabe en una cadena? |
|---|---|---|---|
| 1024 bits | 216 | 234 | Sí |
| 2048 bits | 392 | 410 | No: hacen falta dos |
| 4096 bits | 736 | 754 | No: tres |
Google Workspace y Microsoft 365 generan llaves de 2048 por defecto, y con razón: 1024 está desaconsejado desde la RFC 8301. Así que hoy casi cualquier DKIM nuevo tropieza con esto, y cada proveedor reacciona distinto:
| Proveedor | Qué pasa con 410 caracteres seguidos |
|---|---|
| Route 53 | Rechaza con CharacterStringTooLong, en consola y CLI |
| Google Cloud DNS | Rechaza el valor; tienes que escribir tú las cadenas entre comillas |
| Cloudflare | Lo acepta y lo parte solo en trozos de 255 |
| BIND y la mayoría de servidores propios | El archivo de zona no carga hasta que uses varias cadenas |
La RFC 6376 (§3.6.2.2) obliga a los verificadores a concatenar las cadenas antes de usarlas, así que partir la llave no es un truco: es el formato previsto.
Por proveedor
BIND / archivo de zona
| |
Route 53
En la consola, en Value pega las dos cadenas entre comillas separadas por un espacio o un salto de línea. Por CLI el valor es una sola string con las comillas escapadas:
| |
Google Cloud DNS
En la consola, mismo formato en el campo de datos. Con gcloud:
| |
Con Terraform (google_dns_record_set), un solo elemento en rrdatas con las comillas escapadas:
| |
Cloudflare
Pega el valor completo en Content; el panel lo parte al guardar. Al consultarlo con dig verás dos cadenas aunque tú metiste una: es normal.
Verificar
| |
Lo esperado es "v=DKIM1; k=rsa; p=MIIB..." "...IDAQAB": dos cadenas, en un solo registro. Después comprueba que la llave decodifica a 2048 bits, lo que confirma que no se perdió ningún carácter en el corte:
| |
Si base64 protesta, se coló un espacio dentro de la llave o faltan caracteres. Cierra con un correo de prueba y Authentication-Results: ... dkim=pass en la cabecera; para mirarlo con más detalle, el DKIM Inspector de dmarcian.
Trampas
- El corte puede ir en cualquier sitio, incluso a media base64, pero sin meter espacios dentro de la llave. El espacio entre las dos cadenas separa cadenas, no forma parte del dato.
- No dupliques comillas. Si el panel ya las pone por ti y pegas
"...",digdevuelve"\"v=DKIM1...\""y el verificador falla. - Un registro, no dos. Dos TXT distintos con el mismo nombre son dos valores independientes, y ninguno es una llave válida.
- 2048 es el punto medio. 4096 son tres cadenas y una respuesta DNS que se acerca al límite UDP; funciona, pero no gana nada para DKIM.
- Rotación: publica la llave nueva con otro selector, cambia el firmante, y borra el selector viejo después del TTL. Nunca edites el selector en uso.
- SPF tiene el mismo límite, pero un SPF que no cabe en 255 suele ser señal de demasiados
include:; ahí la solución es acortarlo, no partirlo.
Referencias: Google Workspace — problemas con DKIM, AWS re:Post — CharacterStringTooLong y el DNS record splitter de Mailhardener si prefieres no usar fold.