← RFC Reference

DKIM — DomainKeys Identified Mail

Norme Internet Authentification des e-mails Published March 2026
ELI5: Pensez à DKIM comme à un sceau de cire inviolable sur une lettre. Avant d'envoyer, le serveur de messagerie estampille le message avec un sceau unique (une signature cryptographique). À son arrivée, le destinataire peut vérifier le sceau par rapport à une clé publique publiée dans le DNS. Si le sceau est intact, le message n'a pas été modifié en transit et provient vraiment de quelqu'un ayant accès à la clé privée de ce domaine.

Pourquoi cette RFC existe

SPF vérifie qu'un message provient d'une adresse IP autorisée, mais ne dit rien sur le contenu du message. Un message pourrait réussir SPF, puis être modifié par un relais compromis. SPF se casse également lors du transfert de courrier, car l'IP d'envoi change.

DKIM résout les deux problèmes. En attachant une signature cryptographique au message lui-même, il fournit une assertion d'identité au niveau du domaine qui survit au transfert (la signature voyage avec le message) et garantit l'intégrité du contenu (toute modification invalide la signature).

RFC 6376, publiée en 2011, est la spécification DKIM actuelle. Elle a obsolété RFC 4871 et introduit des améliorations à la canonicalisation, à la gestion des clés et à la sémantique des signatures. Elle reste la base de l'authentification modernes des e-mails aux côtés de SPF et DMARC.

Comment ça marche

Signature (côté expéditeur)

  1. Le serveur de courrier d'envoi (ou un agent de signature en amont) sélectionne les en-têtes et le corps à signer.
  2. Il canonicalise le contenu sélectionné en utilisant des algorithmes simple ou relaxed pour normaliser les espaces et la casse.
  3. Il calcule un hachage du corps canonicalisé, puis un hachage des en-têtes sélectionnés plus le hachage du corps.
  4. Il signe le hachage d'en-tête en utilisant la clé privée du domaine (RSA ou Ed25519).
  5. Il ajoute un en-tête DKIM-Signature au message contenant la signature, le domaine de signature (d=), le sélecteur (s=) et les métadonnées sur ce qui a été signé.

Vérification (côté récepteur)

  1. Le récepteur extrait les valeurs d= (domaine) et s= (sélecteur) de l'en-tête DKIM-Signature.
  2. Il interroge DNS pour la clé publique à <selector>._domainkey.<domain>.
  3. Il re-canonicalise les en-têtes signés et le corps en utilisant le même algorithme spécifié dans la signature.
  4. Il vérifie la signature par rapport à la clé publique. Si valide, le résultat est pass.

Exemple d'en-tête DKIM-Signature

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=mtg20240101; h=from:to:subject:date:message-id:mime-version:content-type; bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=; b=LjIEJLNOTAREALSIGh8gAiGVQOr3K7...truncated...

Enregistrement de clé publique DNS

mtg20240101._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEB...truncated..."

Détails techniques clés

Canonicalisation

Le courrier électronique peut être subtilement modifié en transit (espaces de fin supprimés, en-têtes re-pliés). La canonicalisation normalise le contenu avant le hachage de sorte que les modifications bénignes ne cassent pas la signature. Deux algorithmes sont disponibles, spécifiés séparément pour les en-têtes et le corps :

Algorithme En-têtes Corps
simple Aucune modification sauf espaces de fin sur la valeur d'en-tête Aucune modification sauf lignes vides de fin
relaxed Minuscules des noms d'en-têtes, déplie les lignes, comprime les espaces Comprime les espaces, supprime les espaces de fin par ligne

Le paramètre le plus courant est c=relaxed/relaxed, qui tolère les modifications en transit les plus courantes.

Types de clés

RFC 6376 a défini les signatures RSA. RFC 8463 a ensuite ajouté la prise en charge d'Ed25519. Les clés RSA doivent être d'au moins 2048 bits ; les clés de 1024 bits sont considérées comme faibles et sont rejetées par certains récepteurs. Les clés Ed25519 sont beaucoup plus petites (44 caractères dans DNS) et plus rapides à vérifier.

Sélecteurs

Le sélecteur (s= tag) permet à un domaine de publier plusieurs clés DKIM simultanément. Ceci est essentiel pour la rotation des clés : publiez une nouvelle clé sous un nouveau sélecteur, commencez à la signer, puis supprimez l'enregistrement DNS de l'ancien sélecteur après une période de transition.

La balise l= (limite de longueur du corps)

La balise optionnelle l= limite le nombre d'octets du corps qui sont signés. Cela était destiné à permettre aux listes de diffusion d'ajouter des pieds de page sans casser les signatures. En pratique, cela crée une vulnérabilité de sécurité : un attaquant peut ajouter du contenu malveillant après la partie signée. La plupart des implémentations conscientes de la sécurité évitent d'utiliser l=.

Signature d'en-tête

La balise h= liste les en-têtes inclus dans la signature. La meilleure pratique est de signer au minimum : From, To, Subject, Date, Message-ID, MIME-Version et Content-Type. L'en-tête From est requis par spécification. Signer un en-tête qui n'existe pas empêche qu'il soit ajouté après la signature (une mesure importante anti-rejeu).

Erreurs courantes

Impact sur la livraison

Related RFCs