Signer ses emails avec DKIM
Par Dju » 28 janvier 2010 (02:15) - Serveur
Si vous avez un serveur mail, utilisant postfix, alors voici un outil très pratique pour prouver la provenance des emails envoyés par votre serveur, en leur collant une signature numérique, fonctionnant avec une clé publique/privée.
Cela permettra ainsi d'affirmer que vos emails sont bien envoyés par vous, et également de filtrer les emails ayant une signature incorrecte.
D'abord, comment ça marche ?
on créée un enregistrement DNS sur son domaine dans lequel on indiquera une clé publique, accessible à tout le monde.
En interne, lors de l'envoi d'un email, le serveur utilisera une clé privée pour signer le mail.
Ainsi, à l'autre bout, le serveur recevant le mail pourra, via votre clé publique, vérifier et authentifier sa provenance
On commence par l'installer de manière classique :
aptitude install dkim-filter
aptitude install opendkim
Le fichier de configuration principale se trouve dans /etc/opendkim.conf et voici le contenu à indiquer pour une config. standard et fonctionnelle.
# This is a basic configuration that can easily be adapted to suit a standard # installation. For more advanced options, see opendkim.conf(5) and/or # /usr/share/doc/opendkim/examples/opendkim.conf.sample. # Log to syslog Syslog yes # Required to use local socket with MTAs that access the socket as a non- # privileged user (e.g. Postfix) UMask 002 # Sign for example.com with key in /etc/mail/dkim.key using # selector '2007' (e.g. 2007._domainkey.example.com) Domain mondomaine.com KeyFile /etc/opendkim/private.key Selector dkim # Commonly-used options; the commented-out versions show the defaults. Canonicalization simple Mode sv #SubDomains no #ADSPDiscard no InternalHosts /etc/opendkim/internalhosts
les lignes importantes :
- Domain: indique le domaine pour lequel la signature sera ajoutée à l'email. si plusieurs, les mettre à la suite en les séparant par une virgule
- KeyFile: le chemin vers le fichier contenant votre clé privée
- Selector: le nom de l'enregistrement dns dans lequel allez chercher la clé publique
- Mode: s pour signer les emails sortants et v pour vérifier les entrants.
- SubDomaines: no si pas de sous domaines, yes si vous en avez et que vous souhaitez également avoir les emails signés
- X-Header: ajouter un header dans le mail pour indiquer le logiciel qui signe les mails
- InternalHosts: optionnel, fichier contenant la ou les adresses IP des machines utilisant votre postfix en relai pour envoyer des mails. une adresse ip par ligne, ou un masque de sous réseau (exemple 192.168.0.0/24)
Ensuite, on édite le fichier /etc/default/opendkim dans lequel on configure sur quelle adresse ip et port le démon va écouter.
par défaut, on a plusieurs lignes commentées, et une non commentée :
SOCKET=inet:8891@localhost
Signifie que le démon écoutera en local sur 127.0.0.1 sur le port 8891
A présent, on va générer notre couple de clé privée/publique.
mkdir /etc/opendkim
cd /etc/opendkim
openssl genrsa -out private.key 1024
openssl rsa -in private.key -pubout -out public.key
Attention à garder très précieusement la clé privée. vous devez être le seul à la connaitre sous peine de voir votre authenticité remise en cause lors d"envois d'emails....
Maintenant, on va déclarer notre enregistrement DNS, qui est de type TXT, et de nom selecteur._domainkey.votre_domaine.com
"selecteur" correspond à la ligne Selector indiqué dans opendkim.conf. En l'occurrence dkim.
Si vous aviez mis dans votre fichier "Selector machin", alors votre enregistrement txt aura comme nom machin._domainkey.votre_domaine.com
Pour ceux qui ont un Bind comme serveur DNS, voici la ligne à rajouter dans la zone décrivant votre domaine.
dkim._domainkey.votre_domaine.com. IN TXT "k=rsa; p=votre_clé_publique;"
ou
dkim._domainkey IN TXT "k=rsa; p=votre_clé_publique;"
veuillez noter que sans le . à la fin, le nom de l'enregistrement sera automatiquement complété par le nom de domaine.
remplacez "votre_clé_publique" par le contenu de votre fichier public.key, en n'oubliant pas d'enlever la 1è ligne (-BEGIN RSA PRIVATE KEY-) et la dernière (-END RSA PRIVATE KEY-)
Une fois votre démon opendkim configuré aux p'tis oignons, redémarrez le service
/etc/init.d/opendkim restart
Enfin, on va configurer postfix pour lui indiquer de passer les emails sortant à opendkim afin de les signer.
On édite le fichier /etc/postfix/main.conf et on rajoute ces quelques lignes :
milter_default_action = accept milter_protocol = 2 smtpd_milters = inet:localhost:8891 non_smtpd_milters = inet:localhost:8891
Puis on redémarre postfix pour valider
/etc/init.d/postfix restart
Et voila ! maintenant, il ne reste plus qu'à envoyer un email depuis votre serveur pour vérifier qu'il est bien signé.
Vous devriez retrouver quelque chose comme ça dans les headers:
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=votre_domaine.com; s=dkim; t=1264638542; bh=CUY18yi5KBUf/CwX9/rU/h/Vq4lY/pH69p31s2CUvUc=; h=From:To:Subject:Date:Mime-Version:Content-Type: Content-Transfer-Encoding:Message-id; b=nzkf/UE8TrZlKLKnzass8LgwbDJ54kqEMu3lOz7Sq2dMhsMuRyEgQuDWr36qmpD1T kLto5zqX8iYuM0Z81KLf598rLLATCqnm5fr3neKEMyjc7+iANjpAnAl/wBRnnHPZbs zTxiG+0vdN03Kg2/eDUxgmmxMU4pctBG6rLsDpRY
et si le serveur qui reçoit le mail a également une vérification dkim, alors vous aurez un autre header ressemblant à ça ;:
Authentication-Results: mail.votre_domaine.org; dkim=pass (1024-bit key; insecure key) header.i=@votre_domaine.com; dkim-adsp=none (insecure policy)
Une autre bonne solution pour le tester est d'envoyer un mail sur une adresse gmail.
En le consultant depuis le webmail Gmail, vous trouverez en haut une ligne en plus disant signé par votre_domaine.com
Et la, c'est gagné !
Plus d'infos sur wikipedia et le site officiel
Billet très utile, je le garde sous le coude pour mon prochain serveur
sinon y'a aussi un article sur le SPF, sur system-linux.eu (http://www.system-linux.eu/index.ph...), en complément de celui-ci
Sinon, toujours pas décidé pour ton futur serveur ?
ton billet est très sympa je vais l'essayer sur redhat/centos et je le publierai sur www.system-linux.eu avec ton accord biensur.
salut gangan

no problèmo, c'est fait pour
par contre, sur une distro autre que debian/ubuntu, les dossiers/fichiers ne seront ptêt pas forcément les mêmes ... à voir
Bonjour,
Merci pour le tuto, mais cela ne fonctionne pas à 100% chez moi.
Si on envoi via un client de messagerie sur le serveur, le mail est bien signé, par contre si l'envoi se fait depuis le serveur, via la fonction mail de php, aucune signature n'apparait... ??
Une idée ?
salut elcanux,
quelle adresse de smtp as tu renseigné dans ton php.ini ?
si tu mets 127.0.0.1 ça devrait le faire.
à moins que tu utilises le fichier InternalHosts, dans lequel tu aurais omis de mettre 127.0.0.1 ? :D
Merci de la réponse, j'ai bien localhost dans le php.ini, mais j'ai réussi à corriger le problème en mettant dans le virtualhost d'apache le code suivant :
php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f webmaster@mondomaine.com -F webmaster@mondomaine.com"
Ha, la commande sendmail... bien vu
On peut aussi la configurer dans le php.ini à la ligne "sendmail_path="
Marrant, je n'ai pas eu à configurer ça sur le php de mon ubuntu server...
Cela doit être du au fait que je force postfix à mettre @mondomaine.com à l'adresse d'émetteur si on ne définit pas un from complet.
or, php doit, quand tu envoies un mail, mettre un emetteur générique, du style www-data@localhost, ce qui ne sera pas signé car pas ton domaine.
Pour ce faire, tu peux ajouter dans le main.cf de ton postfix la ligne
myorigin=/etc/mailname
et dans ce fichier mailname, tu mets tondomaine.com.
Ainsi, si tu envoies un mails sans définir un from, ou en mettant un incomplet, par exemple juste "root", ca rajoutera @tondomaine.com après
merci pour ce tuto simple et efficace,
juste une petite typo: private.key et non private-key dans la génération de la clé publique.
oops, bien vu stéphane.
c'est corrigé, merci
Bjr,
Je n'arrive pas à faire tourner la signature dkim, je crois que le pb est au niveau du nom de domaine. Je suis hébergé chez sivit (un serveur vds), et mon nom de domaine est chez gandi. Avec l'interface de ce dernier je ne peux pas ajouter un champ TXT, je suis allé chercher du côté de l'interface du gestionnaire de mon VDS et je pense que j'ai trouvé, j'ai ajouté ceci :
http://www.casimages.com/img.php?i=...
Je ne suis pas sûr de la manip effectuée !!
En envoyant à une adresse Google, je ne trouve pas "signé par ...", purtant je trouve bien "DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=..." !! J'ai testé avec ceci :
http://www.myiptest.com/staticpages...
il confirme bien qu'il n'y pas de signateur dkim
le plus bizarre c'est que google m'affiche les données suivantes :
...dkim=neutral (no signature) ...
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple...
en envoyant depuis un nom de domaine qui n'a pas de signature dkim, dans ma boite gmail je n'ai aucune mention au nom DKIM !! je ne comprend plus
je viens d'essayer un truc : j'ai supprimé le champ TXT et rien n'a changé! une idée de ce que ça voudrait dire ??
Bonjour sami,

normalement, la clé publique doit impérativement être mise dans un champs dns TXT sur votre domaine. sans quoi ça ne peut pas fonctionner.
donc à priori, si le screenshot ci dessus montre l'interface de gestino de sivit et non gandi, cela ne changera malheureusement rien
j'utilise pas gandi mais ça doit être possible d'ajouter un champs txt, non ? si au pire gandi t'en empêches, et que tu n'as pas peur de mettre les mains dans le cambouis, tu peux t'installer un bind sur ton serveur et gérer toi meme ton nom de domaine
Merci Dju pour la réponse. J'ai envoyé un mail à Gandi, ils me disent qu'il faut passer par leurs DNS pour pouvoir ajouter un champs TXT, mais si je n'utilise plus les DNS de mon serveur, le nom de domaine ne pointera plus sur mon serveur ... ou est-ce que je me trompe !! Les services http, ftp, pop... ne fonctionneront plus je pense non ?
Sami, que ce soit les DNS de gandi qui gèrent ton domaine, ou un bind sur ton serveur, cela revient au meme.
L'important est d'avoir la clé dkim publique dans un champs xxx._domainkey de type TXT sur ton domaine.
Actuellement, je comprends que t'utilises ton serveur comme DNS. dans ce cas la édite le fichier de ta zone et rajoute le txt, ça sera good
Salut,
J'ai enfin pu installer DKIM, le problème provenait en fait de l'interface de SIVIT de gestion du serveur, bref j'ai modifié manuellement le fichier de zone de BIND et ça sembler fonctionner PARTIELLEMENT : gmail n'indique pas que le mail est signé, pourtant il y a bien ceci dans le header du mail :
...
Authentication-Results: mx.google.com; ... dkim=pass (test mode) ...
J'ai comparé avec un mail envoyé depuis une boite gmail et j'ai vu qu'il y a une signature DKIM mais aussi DomainKey ... je pensais que c'était la même chose non ??? sinon est-ce que tu as un bon tuto pour installer domainKey sur postfix ?
En effet, j'ai envoyé un mail à check-auth[AT]verifier.port25.com
et voilà ce que j'ai :
SPF check: neutral
DomainKeys check: neutral
DKIM check: pass
Sender-ID check: neutral
SpamAssassin check: ham
Donc il faut maintenant installer DomainKeys
et d'après les tutos que j'ai vu, c'est plus difficile que ton tuto de DKIM
...
autre question : quand j'envoie via SquirrelMail, le mail est bien signé, mais quand je passe par la fonction mail() de php ça ne marche plus !! C'est quoi le problème ?
Bonjour,
Je n'arrive pas non plus à signer mes emails je n'est pas de message d'erreur mais les mail arrivent toujours non signés chez Gmail, peut on voir les messages d'erreurs? Si ou comment?
Merci
@Romain : cet article permet d'installer uniquement la signature DKIM, c'est pour ça que google ne dit rien concernant la signature, il faut aussi configurer la signature DomainKeys de yahoo.
Pour tester je te conseille d'envoyer un mail à check-auth[AT]verifier.port25.com (voir un de mes précedents posts), c'est mieux que de tester avec une boite gmail ou yahoo
Pour installer DK : http://www.howtoforge.com/how-to-im...
Bonsoir
@sami: effectivement, dkim et dkey sont 2 choses différentes. je m'étais un peu penché la dessus, et dkim est plus simple à installer, et aussi plus populaire. d'ou mon choix :p
@Romain: pour que les emails sortants soient signées, il faut impérativement mettre en from une adresse @tondomaine.com, déclaré dans la configuration de dkim. si tu envoies ton mail avec dans le from un autre domaine, ça ne fonctionnera pas. Enfin, vérifie dans ton php.ini le smtp utilisée, et le from par défaut. il ne doit pas être avec ton domaine déclaré dans dkim. (et voir plus haut le problème de elcanux)
j'ai trouvé ton blog absolulement bien sur ton theme j'ai hate vraiment d'en apprendre un peu plus
et sur windows on fait comment ?
salut
beeeen... comment te dire.....
sous win, tu peux deja facilement télécharger une version fonctionnelle d'openssl et générer une clé dkim.
après, qu'importe l'OS, cela dépend surtout de quel logiciel est utilisé pour faire office de serveur mail (ici postfix), chacun ayant certainement ses plugins ou manières propres...
Bonjour,
Bravo pour le Tuto et les échanges, c'est limpide
Bon j'ai tout de même un souci, voici les retours :
- Yahoo : dkim=permerror (no key)
- Hotmail : dkim=temperror header.d=e-cavej.org
- Gmail : dkim=neutral (bad format) header.i=@e-cavej.org
Alors il faut savoir que je gère ma zone DNS sur mon serveur principal et que j'ai fait une délégation de sous domaine vers un autre serveur (newsletter.mondomaine.com), et c'est sur ce serveur que j'envois des emails et bien évidement c'est là que j'ai installé DKIM, donc le problème bien peut-être de là je ne sais pas ...
Merci de votre aide !
Ah oui j'ai oublié le test verifier.port25.com :
- auth-results@verifier.port25.com : DKIM check: fail
Bonjour,
Alors j'ai trouvé mes problèmes, donc je partage si cela pet servir.
1) Je ne sais pas pourquoi (à moins que cela vienne de ma délégation de sous domaine), mais j'avais une erreur dans le log /var/log/mail.err :
Jul 23 16:40:02 newsletter dkim-filter[22471]: E85DC6A6E0: no signature data
Donc mes messages n'était pas signé.Et pour résoudre ça j'ai du mettre dans le dkim-filter.conf :
Domain vorte_domaine.com
à
Domain *
Et là plus d'erreur et les messages sont signés et on le voit dans /var/log/mail.log :
Jul 23 17:39:56 newsletter dkim-filter[28297]: Sendmail DKIM Filter v2.8.2 starting (args: -x /etc/dkim-filter.conf -u dkim-filter -P /var/run/dkim-filter/dkim-filter.pid -p inet:8891@localhost)
Bon, ça allait mieux mais j'avais une erreur la signature n'était pas bonne :
DKIM Result: fail (wrong body hash: expected xiRjOAvF35tsBL7dnKXyENS8xE/OovcpIL7Sf7O5hsw=)
Et là c'était PostFix ... J'ai tout expliqué là http://forum.ubuntu-fr.org/viewtopi... car il y avait le même soucis.
Voilà j'espère que cela peut aider
super, merci pour le retour
De rien, c'est normal !
Bonjour, je découvre SPF et DKIM et j'avoue que je ne comprends pas l'intérêt du second sur le premier. Il me parait très lourd à mettre en place sans pour autant ajouter de sécurité. J'ai loupé quelque chose ?
Bonsoir,

disons que les 2 sont complémentaires
Le 1er (SPF) sert à éviter que les mails de sont domaine ne soient envoyés par une autre adresse IP (vuq que le from du mail se change facilement, il ya toujours des petits malin pour essayer d'en tirer partie...), encore qu'une adresse peut aussi être usurpée.
Et le 2e (DKIM) sert à authentifier l'expediteur grâce à une signature que lui seul peut générer.
Ainsi, tu obtiens une protection à 2 niveau, qui sera mieux qu'une seule.
Comment configurer sous centos6 et plesk ? tous mes mails sont rejetes pas gmail orange et live.
SPF est configuré, DNS txt = v=spf1 +a +mx -all
pour le DKIM, comment faire ?
merci
Bonjour,
Dommage que le paquet dkim_filter ne soit plus disponible
hello
effectivement, dkim-filter ne semble plus dispo
cependant, opendkim est son digne remplacant, corrige un ou 2 bugs, et se configure de la meme façon
Merci pour le tuto,
Ça faisait un bon moment que je cherchait une méthode pour signer avec DKIM, en voilà une simple et bien documentée;
(a noter sur mon ubuntu 14.04 j'ai fait un simple apt-get install opendkim opendkim-tools)
Bon reste DomainKeys maintenant.. soupir....
Bonsoir,
De nos jours, dkim est suffisant, vu que c'est le successeur de domainkeys et a quelques petites choses que domainkeys n'a pas
Perso, j'ai le 1er, bien configuré, et pas le 2e. et aucun probleme.
petit résumé: http://stackoverflow.com/questions/...
J'ai un mx qui est chez google(tata.com) et un mx sur mon serveur perso (toto.com)
Je veux utiliser le serveur SMTP de toto.com sur mon serveur perso j'ai installé le dkim et le spf cela fonctionne en utilisant toto.com mais quand je lui dis à ce smtp que ca vient de from tata.com je n'ai pas la signature spf.
Vous savez si il est possible de le faire signer du smtp de toto.com en passant un from de tata.com?
Cordialement
@dom hello. tout à fait, dans /etc/opendkim.conf, indiquer
Domaine toto.com, titi.com
Tout domaine non spécifié dans cette liste sera juste vérifié, et non signé.
Egalement, il faut du coup que les 2 domaines aient la meme clé privée/publique
Bonjour,
nous avons deux serveurs avec chacun son postfix et trois sous-domaines :
- domain.com pointe sur serveur1
- test.domain.com pointe sur serveur1 et l'application utilise le postfix de serveur1
- dev.domain.com pointe sur serveur1 et l'application utilise le postfix de serveur1
- prod.domain.com pointe sur serveur2 et l'application utilise le postfix de serveur2
De ces trois sous-domaines on envoi des emails du type admin@domain.com (et pas admin@test.domain.com par exemple).
Sauriez vous comment parametrer le dkim pour que tous foncitonnent svp?
Bonjour,
Je cherche à intégrer la signature DKIM dans les mails que j'envoie depuis mon serveur (debian 8.1).
Dans virtualmin, je suis allé dans :
Email messages > DomainKeys Identified Message et j'ai mis pour les différent champs :
Signing of outgoing mail enabled? : oui
Selector for DKIM record name : 2015
Reject incoming email with invalid DKIM signature? : oui
Force generation of new private key? : oui (quant le champs est visible)
Size of new DKIM key : 1024
Additional domains to sign for : nom de la machine (par défaut)
Never sign for domains : vide
DNS records for additional domains : rien de plus que ce qui a été généré
Dans le manager ovh j'ai créé une zone DNS de type TXT ou je rentre :
2015._domainkey IN TXT "v=DKIM1; k=rsa; t=s; p=la_clé_généré" (cela a été récupéré dans le serveur bind modifier le fichier d'enregistrement)
Malgré tout cela, les mails que j'envoie ne contiennent pas de signature DKIM...
Y a t il d'autres configurations à faire afin que cette signature soit intégrée dans les mails ?
Cette signature est elle ajoutée automatiquement ou bien faut-il créer un script pour l'ajouter dans le header des mails ?
Faut-il une clé par domaine, ou une clé pour tout le serveur ?
Je suis un peu perdu...
Si vous pouviez me donner des précisions (ou la solution...)
Cordialement
bobjo
@bobjo: bonsoir. votre config et enregistrements DNS m'ont l'air correct.
sur mes serveurs mails j'utilise opendkim, auquel postfix s'adresse pour signer les mails.
par contre désolé, je ne sais pas comment virtualmin gère la signature des emails sortants
et apres une courte recherche, il s'avere qu'i faut effectivmeent installer un soft qui réalise la signature.
exemple: https://www.virtualmin.com/documentation/email/dkim
courage
Bonjour,
Merci pour ce tuto, j'ai une question :
remplacez "votre_clé_publique" par le contenu de votre fichier public.key, en n'oubliant pas d'enlever la 1è ligne (-BEGIN RSA PRIVATE KEY-) et la dernière (-END RSA PRIVATE KEY-)
Mais ca ne devrait etre :
remplacez "votre_clé_publique" par le contenu de votre fichier public.key, en n'oubliant pas d'enlever la 1è ligne (-BEGIN RSA PUBLIC KEY-) et la dernière (-END RSA PUBLIC KEY-)
?
Merci d'avance
Merci beaucoup pour ce tutoriel, grâce à vous j'ai pu mettre en place facilement la signature DKIM sur mon serveur, je ne trouvais nul part une information claire sur le sujet ... sauf ici !
Fil des commentaires de ce billet
URL de rétrolien : https://blog.crifo.org/trackback/29