Comment signer ses emails avec la norme DKIM ?

Aller, un petit article sur la sécurité informatique pour changer ! Récemment, pour certifier les emails envoyés aux membres du site nageurs.com, l’ajout d’un mécanisme de signature a été mis en place basé sur la norme DKIM.

Cette norme DKIM pour DomainKeys Identified Mail permet de lutter contre le phishing, et surtout de garantir que l’email n’a pas été modifié entre le moment où il a été envoyé ou reçu grace à un mécanisme de signature électronique.

Les objectifs étaient d’améliorer les taux de délivrabilité des emails envoyés, ne pas tomber dans les boîtes spam, et aussi faire apparaître sur Gmail la page Google+ à droite des messages envoyés par le site. Et surtout par curiosité et défi !

On peut le voir sur l’image ci-dessous, le mail est correctement signé (signed-by: nageurs.com).

N’ayant pas trouvé d’article complet sur le sujet, et notamment sur le mécanisme de signature à la main des emails, j’ai décidé d’en faire un petit tutoriel qui explique toutes les étapes, et de vous proposer ici. La lecture (en diagonable bien entendu) de la RFC 4871 est essentielle pour comprendre toutes les subtilités de cette norme, et je vous conseille d’y jeter un coup d’oeil pour prendre connaissance d’autres méthodes de chiffrement, d’algorithmes de concaténation, et de fonction de hashage que je n’évoquerai pas dans cet article.
Voici maintenant les étapes à suivre pour chiffrer des emails. La première étape est de générer une paire de clés : une publique et l’autre qui restera privée. Pour cela il suffit de lancer les commandes suivantes :

openssl genrsa -out rsa.private 1024
openssl rsa -in rsa.private -out rsa.public -pubout -outform PEM

Dans les DNS du serveur ajouter une zone DKIM pour le domaine dkim._domainkey.nageurs.com (vous pouvez remplacer dkim par autre chose, mais garder la chaîne _domainkey). Comme valeur mettre k=rsa; p=[la clé publique sur une seule ligne sans espace]

Il faut bien entendu retirer les lignes « —–BEGIN PUBLIC KEY—– » et « —–END PUBLIC KEY—– » pour votre enregistrement DNS.

Ce site permet de vérifier que le champ DKIM de votre domaine est correct : http://dkimcore.org/c/keycheck Il faut parfois attendre plusieurs heures/jours que se propagent les modifications DNS.

Une fois l’enregistrement réalisé, il reste l’étape de signature des emails. Cette signature est composée d’un certain nombre de champs que nous allons voir ci-dessous.

Voyons étape par étape comment fonctionne la signature de l’email. Imaginons que vous souhaitez signer le mail suivant :

From: test@nageurs.com
To: toto@nowhere.com
Mailer: sans importance
Subject: bonjour de nageurs.com 

Bonjour Toto,
Si tu aimes la natation, inscris toi sur nageurs.com !

A+

Pour l’exemple on va choisir de signer en utilisant l’algorithme de cryptage rsa, et la fonction de hashage sha1.

La première étape est d’appliquer la fonction de hashage sur le contenu de l’email. Tous les retours à la ligne éventuels à la fin du contenu sont supprimés, et saut de ligne sont les deux caractères \r\n, ainsi la taille totale du contenu de l’email ci-dessus est de 75 caractères.

On applique la fonction SHA1 puis on encore le text en base64. Cela donne la chaîne suivante :

8FSexY8XmsBEh/+aIkM3hzA104I=

On isole ensuite les champs d’entête que l’on veut utiliser pour la signature, par exemple « From », « To », et « Subject » avec le début du champ DKIM-Signature. Si on veut signer un champ qui n’existe pas dans le mail d’origine on l’ajoute pour cette étape de signature. Ainsi nous allons signer toute la chaîne suivante :

From: test@nageurs.com
To: toto@nowhere.com
Subject: bonjour de nageurs.com
Content-type:
DKIM-Signature: v=1; a=rsa-sha1; q=dns/txt; l=75; s=dkim;
……..c=simple/simple;
……..h=From:To:Subject:Content-type;
……..d=nageurs.com; i=@nageurs.com;
……..bh=8FSexY8XmsBEh/+aIkM3hzA104I=;
……..b=

Quelques explications sur le champ DKIM-Signature ajouté ci-dessus. Le champ « c » (ici simple/simple) correspond au couple d’algorithmes de concaténation à utliser, la première valeur pour les en-têtes afin de générer le champ « b », le second pour le contenu du mail qui permettra de générer le champ « bh ».

 

Le champ « bh » est généré le premier à partir d’un hash sur le contenu du mail. La fonction de hash est définie par le champ « a », ici « a=rsa-sha1 ». Les entêtes du champ « h » sont celles isolées ci-dessus, juste avant le début du champ « DKIM-Signature » qui se termine pour le moment par « b= ».

 

La chaîne ci-dessus est ensuite encryptée avec la clé privée, et passée en base64. Cela donne la chaîne :

VZbTjEgzUo8z0Bgf7wXQcnvRIoz78U8Eov7gsiZho4HJHzr2Pvh97k+3/0AUL+M
wOdu6KS5cdu/q5JrFyOZtCiurl8VIx2jAvsXQsLvIsUlAbPbMWewx827Va1DD2dqj
ENDJHo29xJDm18PIBmkrUmkZ1xxcTGjf68hGEuyTTBg=

Il suffit de rajouter cette chaîne en face du champ « b= » et assembler le mail complet avec les entêtes d’origine. Cela donne l’email suivant :

From: test@nageurs.com
To: toto@nowhere.com
Mailer: sans importance
Subject: bonjour de nageurs.com
DKIM-Signature: v=1; a=rsa-sha1; q=dns/txt; l=75; s=dkim;
……..c=simple/simple;
……..h=From:To:Subject:Content-type;
……..d=nageurs.com; i=@nageurs.com;
……..bh=8FSexY8XmsBEh/+aIkM3hzA104I=;
……..b=VZbTjEgzUo8z0Bgf7wXQcnvRIoz78U8Eov7gsiZho4HJHzr2Pvh97k+3/0AUL+MwO
……..du6KS5cdu/q5JrFyOZtCiurl8VIx2jAvsXQsLvIsUlAbPbMWewx827Va1DD2dqjENDJHo
……..29xJDm18PIBmkrUmkZ1xxcTGjf68hGEuyTTBg=
 

Bonjour Toto,
Si tu aimes la natation, inscris toi sur nageurs.com !

A+

Pour tester que cela fonctionne vous pouvez bien sûr vous envoyer un email. Il y a auss des outils en ligne permettent ensuite de tester que le mail créé a un entête DKIM-Signature valide : https://9vx.org/~dho/dkim_validate.php

Comme prévu, quelques jours plus tard, la page Google+ apparaît à droite des emails !

Et voilà maintenant vous savez comment signer un email 🙂

N’hésitez pas à faire un lien vers cet article ! Merci 🙂

Vos affaires de piscine : le sac de Djedj

Avec un peu de retard, voici pour conclure la série des sacs de piscine, le sac de Djedj ! Un grand merci à toutes et tous d’avoir partagé vos sacs de piscine 😉 Découvrons ensemble le contenu du.. pardon DES sacs de Djedj.

Donc le contenu de mon(mes) sac(s) est différent suivant que cela soit une séance à Paris avec nos petits camarades de jeu  (poulpes, méduses,…) en ouverture au public ou alors au club où l’ambiance est différente… C’est pas Christophe, TTN ou Gemma qui diront le contraire… 

Alors, pour le premier sac ‘public’, le contenu est assez classique :

Maillot de bain type ‘Gemmo’, lunettes transparentes et bonnet noir comme dress-code avec rechange maillot, bonnet au cas où…
La serviette basique en coton de cotonnier, la petite pochette pour ranger mon dress code, shampooing et gel douche et le sac à dos pour ranger le tout…

Pour le deuxième sac ‘Club’ :

Maillot de bain noir, bonnet du club et lunettes transparentes. Toujours du rechange, maillot, bonnet rouge et lunettes suédoises.
On rajoute le pull kick, les palmes longues, plaquettes. On a toujours la serviette en coton de cot…ier, les trucs pour se laver et la bouteille mélange jus de raisin/eau, ma potion magique, quoi… 😀

Tiens, j’oubliais : le T-Shirt pour les séries  qui démontent les épaules (celles que je préfère, en fait…)…

Et puis, mon côté rangement avec le sac pour le dress-code et le sac pour ranger le matos.

Tout cela tiens bien évidemment dans le grand sac montré sur la photo même s’il est trop petit pour le pull kick…

Bref, tout ce qu’il y a de banal pur s’entraîner régulièrement et sérieusement en grand, moyen et petit bac…

Pour l’eau libre, il reste à rajouter le ravitaillement, la graisse, les gants pour appliquer la graisse et pas mal d’eau pour la récupération. Mais, pour cela il faudra attendre l’année prochaine… 😉