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 :
- le contenu message original avant signature
- 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.
Bonjour, je voulais savoir a quoi correspond votre retrieveMessageFromMailBox().