blog.bressure.net

Carnet professionnel d'un informaticien

Application, Langage

Réception de mail crypté S/MIME avec Javamail-crypto

admin
Crypto stub
Image via Wikipedia

Dans le billet précédent je montrais comment envoyer un mail S/MIME, ce billet traite de l’opération inverse. Comment réceptionner un mail crypté et signé en S/MIME ?

L’idée est de reprendre la méthode de lecture du certificat publique du signataire pour vérifier la signature du mail mais il faut auparavant décrypter le mail reçu. En effet l’expéditeur signe le message puis le crypte donc on doit décrypter puis vérifier la signature une fois que le mail est devenu lisible.
Voici le pseudo-code

MimeMessage m = retrieveMessageFromMailBox();
m = decryptMessage(m);
checkSignature(m);

La lecture du message dans la boite mail ne pose pas de grande difficulté mais le résultat est un mail avec comme content-type la valeur application/pkcs7-mime. Malheureusement le code utilitaire SMIMEEncryptionUtils de javamail-crypto (qui décrypte un message contient un oubli qui l’empêche de gérer les mails cryptés contenant des PJ comme c’est le cas dans un mail signé. En effet le résultat du décryptage doit être un mail avec le content-type valant multipart/signed ou application/pkcs7-mime ou bien application/x-pkcs7-mime, sinon le mail n’est pas détecté comme un mail signé. Or le méthode qui décrypter decryptMessage.decryptMessage()oublie malheureusement d’invoquer saveChange()sur le message. Aussi le le content-type n’est pas mis à jour. So do it yourself !

Ensuite il suffit d’appeler la méthode utilitaire de vérification de signature SMIMEEncryptionUtils.checkSignature() pour finir la partie réception d’un S/MIME. Il est a noté que le mail signé par SMIMEEncryptionUtils.signeMessage() est de type multipart/signed ce qui signifie que le mail est constitué de 2 partie :

  1. le contenu message original avant signature
  2. la signature portant sur le message original précédent

Il faut en tenir compte pour extraire les informations du message original. C’est-à-dire que le contenu du mail décrypté que l’on obtient par MimeMessage.getContent() pourra être itéré mais on ne s’intéressera qu’à sa première partie. Cette première partie obtenue par Multipart.getBodyPart() sera soit considéré comme  le contenu du corps du message original avant signature si son content-type est text/plain mais si le message original avait déjà des pièces-jointes le content-type sera multipart/mixed et il faudra alors itérer sur la première partie. La forme du message original dépend du client mail utilisé pour créer le message original avant signature et cryptage.

Tags:

Comments

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Back to top