Dans la première partie, nous avons effectué un rapide tour d'horizon de S/MIME, en examinant la signature et le cryptage de nos flux de messages à travers une gamme de clients de messagerie. Les messages S/MIME peuvent être signés (fournissant une preuve de l'identité de l'expéditeur), cryptés (gardant le corps du message secret), ou les deux.
Business in a box.
Découvrez nos solutions.
Parlez à notre équipe de vente

Dans cette tranche, nous allons :
Installer quelques outils de ligne de commande simples pour signer et chiffrer les emails
Obtenez votre clé/certificat d'expéditeur pour la signature
Envoyez un message signé via SparkPost, et regardez le message reçu
Optionnellement, obtenez votre certificat de destinataire pour le chiffrement
Envoyez un message signé et chiffré via SparkPost, et regardez le message reçu
Essayez un outil autonome pratique "mimeshow" pour examiner les fichiers internes des emails.
D'accord – commençons !
1. Installer les outils
Les outils de démonstration sont sur Github ici, complets avec les instructions d'installation. Vous pourriez remarquer le logo « build passing » – Travis et pytest vérifient automatiquement le statut de la build. Notez que ces outils ne sont pas officiellement supportés par SparkPost, mais j'ai essayé de les rendre robustes et faciles à utiliser.
Si vous avez quelques connaissances en Python et pip, l'installation devrait vous sembler assez familière. Le fichier Pipfile prend automatiquement en charge les dépendances externes pour vous. Une fois cela fait, vous pouvez vérifier que tout est installé en exécutant
./sparkpostSMIME.py -h
Vous devriez voir le texte d'aide amical. Ensuite, nous devons…
2. Obtenez votre clé / certificat d'expéditeur pour la signature
Si vous avez déjà un fichier clé pour votre identité d'envoi, vous pouvez passer à l'étape suivante. Sinon, voici deux options parmi lesquelles choisir :
a) Clé de test auto-signée / certificat (non valide à l'extérieur)
Si vous testez simplement, vous pouvez créer des certificats et des clés "auto-signés" pour une adresse email à l'aide de l'outil en ligne de commande openssl sur Linux, en suivant une procédure telle que celle-ci. À la fin de ce processus, vous aurez un fichier smime.p12. Renommez ce fichier pour qu'il corresponde à votre identité d'envoi, y compris le signe @, par exemple, alice@example.com.p12.
ou
b) Clés/certificats valides à l'extérieur
Si vous souhaitez obtenir des clés/certificats valides à l'extérieur qui vous permettent de signer, il y a une liste de fournisseurs ici. J'ai trouvé que Comodo fonctionne bien (gratuit pour un usage non commercial), et c'est plus facile que la procédure d'auto-signature ci-dessus. Suivez le processus d'inscription, recevez votre email de validation, et assurez-vous d'ouvrir le lien dans Firefox. Allez dans Préférences Firefox / Vie privée et sécurité. Faites défiler jusqu'à Certificats / Voir les certificats :

Sélectionnez votre certificat et utilisez l'option “Sauvegarder” pour enregistrer en tant que fichier au format PKCS12 (ajoutez l'extension de fichier .p12 à votre nom de fichier) qui contient la clé privée et la chaîne de certificats publics.

Fournissez un mot de passe pour sécuriser le fichier .p12 :

Générer des fichiers de clé publics (.crt) et privés (.pem) séparés
Que vous ayez utilisé a) ou b), vous aurez maintenant un fichier .p12 pour votre identité d'expéditeur. C'est un grand pas en avant – prenez un café maintenant !
Maintenant, nous devons générer des fichiers de clé publics et privés séparés comme ceci – en remplaçant par votre propre adresse email pour l'exemple. (Mac OSX et Linux) :
openssl pkcs12 -in alice\@example.com.p12 -clcerts -nokeys -out alice\@example.com.crt openssl pkcs12 -in alice\@example.com.p12 -nocerts -nodes -out alice\@example.com.pem
Vous devrez entrer le mot de passe que vous avez fourni plus tôt. Notez que ces barres obliques inverses \ sont utilisées pour échapper au signe @ – cela ne sépare pas les noms d'un chemin de répertoire (c'est une barre oblique / sur Mac OSX et Linux).
Si vous utilisez Windows, il existe des implémentations openssl disponibles telles que celle MINGW64 intégrée aux outils en ligne de commande Git, mais j'ai constaté qu'elle avait tendance à planter. Vous trouverez probablement plus facile et rapide de faire cela sur Linux, puis de copier vos fichiers. Ces mêmes outils Git pour Windows sont livrés avec un joli client ssh que vous pouvez utiliser pour vous connecter à une machine Linux, comme une instance Amazon EC2.
2.1 Signer un message
Il y a déjà un fichier source de clé/certificat factice et d'email dans le répertoire de tests pour alice@example.com, donc vous pouvez obtenir un résultat même avant d'avoir vos propres clés. Il suffit de taper ce qui suit :
cd tests ../sparkpostSMIME.py example_email1.eml --sign
Et vous obtiendrez :
To: Bob <bob@example.com> From: Alice <alice@example.com> Subject: A message MIME-Version: 1.0 Content-Type: application/x-pkcs7-mime; smime-type=signed-data; name="smime.p7m" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7m" MIIKXAYJKoZIhvcNAQcCoIIKTTCCCkkCAQExDzANBglghkgBZQMEAgEFADCCAQoGCSqGSIb3DQEH AaCB/ASB+VRvOiBCb2IgPGJvYkBleGFtcGxlLmNvbT4NCkZyb206IEFsaWNlIDxhbGljZUBleGFt : :
Vous ne pouvez pas réellement envoyer des emails depuis example.com via SparkPost à moins que vous ne possédiez ce domaine, donc la prochaine étape est d'utiliser votre propre clé et d'envoyer un message signé depuis votre propre domaine.
3. Envoyer un message signé via SparkPost
Maintenant, utilisons un domaine d'envoi réel, configuré selon le Guide du nouvel utilisateur SparkPost. Nous avons le certificat de l'expéditeur et les fichiers clés dans le répertoire actuel :
steve@thetucks.com.crt steve@thetucks.com.pem
Le fichier tests/declaration.eml est inclus dans le projet. C'est juste un fichier texte, donc vous pouvez personnaliser l'adresse From: pour convenir à votre propre domaine d'envoi et l'adresse To: pour convenir à votre destinataire de test. Le début du fichier ressemble à ceci :
To: Bob <bob.lumreeker@gmail.com> From: Steve <steve@thetucks.com> Subject: Voici notre déclaration MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-GB Lorsque dans le cours des événements humains, il devient nécessaire…
Définissez votre clé API :
export SPARKPOST_API_KEY=<<Mettez votre clé API ici>>
Envoyez l'e-mail :
./sparkpostSMIME.py tests/declaration.eml --sign --send_api
Vous verrez :
Ouvert connexion à https://api.sparkpost.com/api/v1 Envoi de tests/declaration.eml From: Steve <steve@thetucks.com> To: Bob <bob.lumreeker@gmail.com> OK - en 1,15 secondes
Une seconde environ plus tard, l'e-mail arrive dans la boîte de réception de Bob. Thunderbird l'affiche avec un point rouge sur l'enveloppe, indiquant une signature d'expéditeur valide.

Succès ! Finissez votre café, vous l'avez mérité. Si vous rencontrez des problèmes, vérifiez que votre adresse From: dans le fichier e-mail correspond au nom de vos fichiers .crt et .pem.
4. Chiffrement des messages
Pour chiffrer un message, vous avez besoin de la clé publique de votre destinataire sous forme de certificat. C'est un fichier texte qui ressemble à ceci :
Bag Attributes friendlyName: s COMODO CA Limited ID #2 localKeyID: 32 84 AB 9C 56 5C 80 C6 89 4D 40 46 DD D4 7C 71 E8 CD ED C1 subject=/emailAddress=bob.lumreeker@gmail.com issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Client Authentication and Secure Email CA -----BEGIN CERTIFICATE----- ressemble à des caractères aléatoires ici -----END CERTIFICATE-----
Il y a un certificat de destinataire fictif pour bob@example.com dans le répertoire des tests, vous pouvez donc vous entraîner avec avant d'avoir un vrai certificat :
cd tests ../sparkpostSMIME.py example_email1.eml --sign --encrypt
Vous verrez :
To : Bob <bob@example.com> From : Alice <alice@example.com> Subject : A message MIME-Version: 1.0 Content-Type: application/pkcs7-mime; smime-type=enveloped-data; name=smime.p7m Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=smime.p7m MIIRwQYJKoZIhvcNAQcDoIIRsjCCEa4CAQAxggKlMIICoQIBADCBijCBhDELMAkG :
Vous remarquerez que la longueur de la sortie est beaucoup plus longue qu'avec un message chiffré car elle contient beaucoup d'informations supplémentaires ainsi que le message brouillé lui-même.
4.1 Envoyer un message chiffré et signé via SparkPost
Envoyons un message chiffré à une véritable adresse e-mail. Vous pouvez suivre le même processus qu'auparavant (auto-signé ou un fournisseur tel que Comodo) pour obtenir une clé publique / un certificat pour vos propres adresses de destinataire. Vous n'avez besoin que du fichier .crt – le destinataire n'a jamais besoin de vous donner sa clé privée (fichiers .p12 et .pem).
J'ai le fichier bob.lumreeker@gmail.com.crt pour mon destinataire prévu – correspondant à l'adresse From : dans mon fichier.
Voici la commande à envoyer :
./sparkpostSMIME.py tests/declaration.eml --sign --encrypt --send_api
Je vois :
Connexion ouverte à https://api.sparkpost.com/api/v1 Envoi tests/declaration.eml From : Steve <steve@thetucks.com> To : Bob <bob.lumreeker@gmail.com> OK - en 1,168 secondes
Le courrier apparaît dans Thunderbird avec l'icône de signature «point rouge» et l'icône de cadenas chiffré.

Vous pouvez envoyer des e-mails complexes basés sur HTML avec des liens et des images tout aussi facilement, comme celui montré dans la Partie 1. Certains clients tels que Thunderbird demandent la permission d'afficher des liens et des images externes dans les messages chiffrés S/MIME, mais les messages signés uniquement s'affichent bien dans les clients, y compris Thunderbird et Gmail :


Notez que le menu déroulant montre «Adresse email vérifiée».
Réflexions supplémentaires et choses à prendre en compte
Cet outil adopte une approche ultra-simple pour récupérer les clés nécessaires – il cherche simplement des fichiers nommés dans le répertoire actuel. Des arrangements plus complexes, tels que la conservation de toutes les clés dans une base de données, pourraient facilement être ajoutés, mais je voulais que le code soit aussi simple que possible.
Vous pouvez inclure d'autres destinataires avec Cc: et Bcc: et ils seront livrés ; cela pourrait être utile pour des fins d'archivage. Les messages signés sont reçus et peuvent être affichés par d'autres destinataires avec la signature complète. L'outil retire l'en-tête Bcc: du message livré (comme le ferait un client de messagerie de bureau).
Pour garantir que les messages passent par SparkPost sans changements (ce qui pourrait casser la signature), l'outil définit les options API pour les envois « transactionnels », avec le suivi de l'ouverture et du clic désactivé.
Si vous utilisez le cryptage, gardez à l'esprit que l'outil récupère l'adresse To: unique pour cela. Les autres destinataires ne peuvent décoder le corps du message que s'ils possèdent la clé privée du destinataire To:. Si vous n’utilisez que des destinataires secondaires pour garder trace des livraisons effectuées, par exemple, cela peut convenir malgré tout.
Signé, scellé, livré…Je suis à toi
C’est notre rapide aperçu de comment signer, sceller et livrer des messages S/MIME via SparkPost. Bref rappel : le projet démo est sur Github ici, j’ai essayé de le rendre facile à installer et à utiliser.
Fonctionnalité bonus : affichage des parties MIME avec "mimeshow"
Les fichiers internals multiparties MIME RFC822 sont assez complexes à lire pour les humains. Le projet inclut un outil autonome pour faciliter cela, appelé mimeshow.
Cela prend n'importe quels fichiers email que vous avez (pas seulement ceux S/MIME) et montre la structure interne. Voici un exemple :
./mimeshow.py testcases/img_and_attachment.eml
Vous verrez :
À Bob <bob.lumreeker@gmail.com> De Steve <steve@thetucks.com> Sujet Testing attachments etc MIME-Version 1.0 Content-Type multipart/mixed; boundary="------------7D48652042860D0098C65210" Content-Language en-GB Content-Type multipart/alternative; boundary="------------58C0BF87598336550D70EB95" Content-Type text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding 7bit Content-Transfer-Encoding quoted-printable Content-Type text/html; charset="utf-8" Content-Type application/pdf; name="sparkpost-datasheet-tam-technical-account-management.pdf" Content-Transfer-Encoding base64 Content-Disposition attachment; filename="sparkpost-datasheet-tam-technical-account-management.pdf"
Vous pouvez également utiliser comme filtre pour donner un résumé lisible par l'homme de sparkpostSMIME output :
./sparkpostSMIME.py tests/declaration.eml --sign --encrypt | ./mimeshow.py
Vous verrez :
À Bob <bob.lumreeker@gmail.com> De Steve <steve@thetucks.com> Sujet Here is our declaration Content-Language en-GB MIME-Version 1.0 Content-Type application/pkcs7-mime; smime-type=enveloped-data; name=smime.p7m Content-Transfer-Encoding base64 Content-Disposition attachment; filename=smime.p7m
Enfin…
Pour récapituler – nous avons installé quelques outils simples en ligne de commande pour signer et chiffrer les e-mails (le dépôt Github est ici, avec les instructions d'installation).
Nous avons obtenu notre clé / certificat d'expéditeur pour la signature, et envoyé un message signé via SparkPost. Nous avons obtenu un certificat de destinataire pour le chiffrement, puis envoyé un message signé et chiffré via SparkPost.
Enfin, nous avons essayé l'outil autonome pratique "mimeshow" pour examiner les internals des fichiers d'e-mail.
C'est tout pour le moment ! À bientôt !