Longueur de clé DKIM : 2048 bits ne tiennent pas en une ligne

Une clé DKIM de 1024 bits tient dans une seule chaîne TXT du DNS. Une clé de 2048 bits, non, et ce seul fait explique presque tout ce qui se passe mal quand un domaine se met à jour : l’enregistrement doit être publié sous forme de plusieurs chaînes entre guillemets qu’un destinataire recolle, et les outils intermédiaires ne coopèrent pas toujours. La clé qui ressort à l’autre bout est plus courte que celle que vous avez générée, et rien dans votre flux de courrier ne vous le dit.

La RFC 8301 l’a dit tout haut en 2018. Elle exige des signataires au moins 1024 bits et en recommande au moins 2048, et elle explique dans le même document pourquoi les clés plus fortes sont restées rares : les logiciels de provisionnement DNS qui ne gèrent qu’une chaîne de 255 octets dans un enregistrement TXT ne peuvent pas les contenir.

La longueur de la clé est la valeur p=, et rien d’autre

Un enregistrement DKIM est un enregistrement TXT placé en <selector>._domainkey.<domain> et contenant une clé publique. La balise p= la porte, encodée en base64, et sa longueur est la longueur de la clé. Rien d’autre dans l’enregistrement n’indique la force : pas de balise de bits, pas de taille d’algorithme, aucun champ qu’un panneau DNS pourrait vous montrer.

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

Pour une clé RSA, p= contient une structure SubjectPublicKeyInfo : un conteneur imbriqué portant l’identifiant d’algorithme puis le module et l’exposant. La longueur en bits est la largeur de ce module, et c’est pourquoi la lire suppose d’analyser la structure plutôt que de mesurer la chaîne.

Cela compte plus qu’il n’y paraît, car la longueur de la chaîne et celle de la clé se séparent dès que quelque chose tronque la valeur.

2048 bits ne tiennent pas dans une seule chaîne DNS

Un enregistrement TXT du DNS est fait de chaînes de caractères d’au plus 255 octets chacune. Les valeurs plus longues sont publiées sous forme de plusieurs chaînes entre guillemets qu’un destinataire concatène sans séparateur. Mesuré sur des clés fraîchement générées, voici ce que coûte chaque taille.

CléValeur p= en base64Enregistrement entierChaînes DNS nécessaires
RSA 1024216 caractères2341
RSA 2048392 caractères4102
RSA 4096736 caractères7543
Ed2551944 caractères661

L’enregistrement d’exemple de la RFC 8463 elle-même publie une clé RSA en quatre chaînes entre guillemets, et un destinataire les assemble sans rien entre elles. C’est du DNS correct, et un destinataire s’en accommode sans difficulté.

La défaillance se situe en amont du destinataire. Un panneau de provisionnement qui n’accepte qu’une chaîne conserve silencieusement les 255 premiers caractères. Un panneau qui accepte la valeur entière mais insère une espace ou un saut de ligne là où étaient les guillemets produit un base64 comportant un caractère étranger à l’alphabet. Un export puis un réimport par fichier de zone peut perdre les guillemets entièrement. Chacun de ces cas produit un enregistrement qui commence toujours par v=DKIM1; k=rsa; p= et qui a toujours l’air correct dans un navigateur.

Une clé tronquée se lit comme un 2048 assuré si l’on croit l’enregistrement

C’est la partie qui mérite du soin, car elle décide si un outil de vérification sert à quelque chose.

La longueur d’un module RSA est déclarée à l’intérieur de la structure de la clé. Un lecteur qui croit la longueur déclarée trouve l’en-tête du module, lit le nombre d’octets qu’il prétend contenir et annonce la taille que ces octets représenteraient. Si la valeur a été coupée après cet en-tête, la longueur déclarée vaut toujours 2048 bits alors que les octets n’y sont plus, et le lecteur répond « 2048 » sans hésiter. Coupez une vraie clé à chaque décalage d’octet et l’immense majorité de ces coupures est rapportée comme une clé intacte de la taille prévue.

Notre propre outil de vérification DKIM exige que chaque longueur imbriquée de la structure se termine exactement là où se termine son conteneur. Une clé tronquée en un point quelconque, ou portant des résidus à la fin, devient impossible à analyser au lieu d’annoncer une taille plus courte ou la taille prévue, et une clé inanalysable est signalée comme un échec et non comme une clé absente. Une clé qui ne vérifie rien et une clé qui n’est pas publiée sont deux problèmes distincts aux solutions distinctes, et un outil qui les signale pareillement vous envoie au mauvais endroit.

Sur les domaines que nous testons pour le Unspam 2026 Email Deliverability Benchmark, 90 % signent avec une clé DKIM qui fonctionne : ce n’est donc pas un défaut d’adoption. C’est une catégorie de panne silencieuse à l’intérieur de ces 90 %.

Un p= vide est une révocation, pas une clé absente

v=DKIM1; k=rsa; p= sans rien après le signe égal est un enregistrement valide, et il signifie que la clé a été révoquée. La RFC 6376 le définit ainsi à dessein, pour qu’une clé compromise puisse être retirée sans supprimer l’enregistrement et laisser les destinataires deviner si le nom a simplement échoué à se résoudre.

Traitez la différence comme réelle. Un sélecteur révoqué est une décision que quelqu’un a prise ; un sélecteur absent est un déploiement qui n’est pas allé au bout. Dans une requête DNS ils se ressemblent énormément, et ils appellent des réponses opposées.

Il en va de même pour une rotation. Les sélecteurs existent pour qu’un domaine puisse porter plusieurs clés à la fois, et avoir s1._domainkey et s2._domainkey actifs ensemble est la façon de tourner sans trou. La signature nomme le sélecteur qu’elle a utilisé et un destinataire ne consulte que celui-là ; publier la nouvelle clé avant de basculer le signataire est donc l’ordre sûr, et retirer l’ancienne avant que le dernier message signé avec elle soit remis est l’ordre risqué.

Les clés Ed25519 font 32 octets bruts, pas une structure de clé

La RFC 8463 a ajouté la signature Ed25519, et l’enregistrement correspondant n’a pas la forme de celui de RSA. Avec k=ed25519, la valeur p= est la clé publique brute de 32 octets et non une SubjectPublicKeyInfo, ce qui explique qu’elle tienne en 44 caractères base64 et entre toujours dans une seule chaîne DNS.

La conséquence pratique est que toute autre longueur n’est pas une clé. Un fragment de 30 octets, une valeur tronquée ou une clé RSA entière restée sous une balise ed25519 sont tous inutilisables, et un outil qui annonce « Ed25519, présent » devant n’importe quelle valeur non vide ne vous apprend rien. Vérifiez la longueur, pas la présence.

L’adoption reste assez mince pour qu’Ed25519 soit d’ordinaire publié à côté de RSA plutôt qu’à sa place, car un destinataire qui ne le prend pas en charge traite la signature comme non vérifiable au lieu de se rabattre sur l’autre.

t=y fait que la signature ne compte pour rien, quelle que soit la clé

La balise t porte des drapeaux, et t=y signifie que le domaine est en test. La RFC 6376 dit à un destinataire qu’il « MUST NOT treat messages from Signers in testing mode differently from unsigned email », ce qui est plus fort qu’ignorer les échecs : la signature n’apporte strictement rien, DKIM ne peut donc pas s’aligner, et un domaine qui compte sur l’alignement DKIM n’obtient aucune réussite DKIM tant que le drapeau est posé.

Les drapeaux de test sont censés disparaître à la fin d’un déploiement, et souvent ils restent. Si un domaine publie une clé parfaite de 2048 bits, signe chaque message et accumule pourtant des échecs DMARC qu’il ne s’explique pas, vérifiez cette balise avant toute autre chose.

L’autre drapeau de la même balise est plus discret. t=s interdit à l’identité signataire d’être un sous-domaine de d=, ce qui est un durcissement délibéré et non un défaut, et aussi la différence entre un signataire qui fonctionne et un signataire qui s’arrête le jour où quelqu’un pointe un sous-domaine vers la même clé.

Que vérifier sur une clé déjà publiée

Six vérifications, dans l’ordre qui trouve les problèmes le plus vite.

  1. Que la clé s’analyse tout court. Non pas qu’un enregistrement existe au sélecteur, mais que la valeur qu’il contient soit une clé complète. C’est la vérification qui attrape une mise à jour tronquée.
  2. Que la force soit d’au moins 1024 bits et de préférence 2048. En dessous de 1024, un destinataire ne doit pas tenir la signature pour valide ; entre 1024 et 2048 elle est valide et en dessous de ce que recommande la RFC 8301.
  3. Que p= ne soit pas vide, sauf révocation volontaire.
  4. Pas de t=y. Si le déploiement est terminé, le drapeau de test devrait avoir disparu.
  5. Que chaque plateforme qui envoie en votre nom ait son propre sélecteur actif. Votre ESP, votre CRM, votre service d’assistance et votre outil de facturation en publient chacun un, et ils sont ajoutés à des moments différents par des personnes différentes.
  6. Que le sélecteur porté par la signature se résolve. Une clé publiée sous un nom que le signataire n’utilise pas est invisible.

Une réussite DKIM est nécessaire et non suffisante, car DMARC exige que le domaine signataire s’aligne avec l’adresse de votre en-tête From, et un message peut être parfaitement signé par le domaine propre d’une plateforme et échouer quand même. Notre guide des signatures DKIM couvre le format de l’enregistrement, notre guide de l’authentification des e-mails explique comment les trois enregistrements dépendent les uns des autres, et la même forme de panne silencieuse du côté SPF fait l’objet de notre guide du mécanisme include de SPF.

Pour voir la clé qu’un destinataire lit réellement, à côté du résultat de signature sur un vrai message, faites un test de spam gratuit.

Questions fréquentes

Quelle longueur doit faire une clé DKIM ?

Au moins 1024 bits et de préférence 2048. La RFC 8301 exige des signataires des clés RSA d’au moins 1024 bits et indique qu’ils devraient en utiliser d’au moins 2048, et elle impose aux destinataires de refuser comme invalides les signatures faites avec des clés inférieures à 1024 bits. Une clé comprise entre 1024 et 2048 bits se vérifie toujours, c’est donc un avertissement et non un échec, mais elle est en dessous de ce que recommande la spécification. Les destinataires doivent pouvoir valider des clés de 1024 à 4096 bits.

Pourquoi mon courrier a-t-il cassé après le passage de la clé DKIM à 2048 bits ?

Parce qu’une clé de 2048 bits ne tient pas dans une seule chaîne de caractères DNS. Un enregistrement TXT est construit à partir de chaînes d’au plus 255 octets, et l’enregistrement entier d’une clé de 2048 bits atteint environ 410 caractères : il doit donc être publié en deux chaînes entre guillemets qu’un destinataire assemble sans rien entre elles. Un logiciel de provisionnement qui ne gère qu’une chaîne garde les 255 premiers caractères, et un logiciel qui reformate les guillemets peut insérer une espace ou un saut de ligne dans le base64. Dans les deux cas l’enregistrement commence toujours par v=DKIM1 et paraît toujours correct.

Combien de chaînes DNS faut-il pour une clé DKIM ?

Mesurée sur des clés fraîchement générées, la valeur p= en base64 fait 216 caractères en RSA 1024, 392 en RSA 2048 et 736 en RSA 4096, et les balises qui la précèdent en ajoutent 18. L’enregistrement entier atteint donc 234, 410 et 754 caractères, ce qui demande respectivement une, deux et trois chaînes DNS. Une clé Ed25519 fait 44 caractères de base64 et 66 au total, elle tient donc toujours en une seule.

Un outil de vérification DKIM distingue-t-il une clé tronquée d’une clé valide ?

Seulement s’il refuse de croire la longueur déclarée. La taille d’un module RSA est indiquée à l’intérieur de la structure de la clé : un lecteur qui trouve l’en-tête et le croit annonce la taille prévue même si les octets suivants ont été coupés. Couper une vraie clé à chaque décalage d’octet donne une réponse à la taille prévue pour l’immense majorité des coupures. Exiger que chaque longueur imbriquée se termine exactement là où se termine son conteneur rend une troncature inanalysable au lieu de courte, et une clé inanalysable est un échec et non une clé absente.

Que signifie un p= vide dans un enregistrement DKIM ?

Cela signifie que la clé a été révoquée, et non que l’enregistrement est incomplet. La RFC 6376 définit ainsi une valeur p= vide à dessein, pour qu’une clé compromise puisse être retirée sans supprimer l’enregistrement et sans laisser les destinataires incapables de distinguer un retrait d’un nom qui n’a pas résolu. Un sélecteur révoqué est une décision que quelqu’un a prise et un sélecteur absent est un déploiement qui n’est pas allé au bout, et ils appellent des réponses opposées.

Une clé DKIM Ed25519 vaut-elle mieux qu’une clé RSA ?

Elle est plus courte et tient toujours dans une seule chaîne DNS, ce qui supprime toute la catégorie des problèmes de troncature, mais la prise en charge n’est pas universelle. Un destinataire qui n’implémente pas Ed25519 traite la signature comme non vérifiable au lieu de se rabattre sur une autre, elle est donc normalement publiée à côté de RSA plutôt qu’à sa place. L’enregistrement a aussi une autre forme : avec k=ed25519 la valeur p= est la clé publique brute de 32 octets et non une SubjectPublicKeyInfo, donc toute autre longueur n’est pas une clé utilisable.

Découvrez où votre campagne arrive vraiment.

Lancer un test antispam gratuit Test Inbox Placement