Dans cet épisode, nous allons :
Installer des outils de ligne de commande simples pour signer et chiffrer des e-mails
Obtenir votre clé / certificat d'expéditeur pour la signature
Envoyer un message signé via SparkPost et regarder le message reçu
Facultativement, obtenir le certificat de votre destinataire pour le chiffrement
Envoyer un message signé et chiffré via SparkPost et regarder le message reçu
Essayer un outil autonome pratique "mimeshow" pour examiner les fichiers d’e-mail internes.
D'accord – commençons !
1. Installer les outils
Les outils de démonstration sont sur Github ici, complets avec des instructions d'installation. Vous remarquerez peut-être le logo "build passing" – Travis et pytest vérifient automatiquement l'état de la construction. 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 une certaine connaissance de Python et pip, l'installation devrait vous sembler assez familière. Le Pipfile s'occupe automatiquement des dépendances externes pour vous. Une fois que c'est fait, vous pouvez vérifier si tout est installé en exécutant
./sparkpostSMIME.py -h
Vous devriez voir le texte d'aide amical. Ensuite, nous devons…
2. Obtenir 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 à choisir :
a) Clé / certificat de test auto-signé (non valide extérieurement)
Si vous ne faites que tester, vous pouvez créer des certificats et des clés "auto-signés" pour une adresse e-mail en utilisant l'outil de ligne de commande openssl sur Linux, suivant une procédure comme 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 extérieurement
Si vous souhaitez obtenir des clés / certificats valides extérieurement qui vous permettent de signer, il existe une liste de fournisseurs ici. J'ai trouvé Comodo qui 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 mail de validation, et ouvrez le lien dans Firefox. Allez dans Préférences / Confidentialité et sécurité de Firefox. Faites défiler jusqu'à Certificats / Afficher les certificats :
Sélectionnez votre certificat et utilisez l'option "Sauvegarder" pour enregistrer sous forme de 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é publique (.crt) et privée (.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é publique et privée séparés comme ceci – substituant votre propre adresse e-mail 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 précédemment. Notez que ces barres obliques inverses \ sont utilisées pour échapper le signe @ – ne séparant 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 d'openssl disponibles comme celle de MINGW64 intégrée dans les outils en ligne de commande Git, mais j'ai trouvé qu'elle avait tendance à se bloquer. Vous trouverez probablement plus facile et plus rapide de faire cela sur Linux puis de copier vos fichiers. Ces mêmes outils Git pour Windows sont livrés avec un bon client ssh que vous pouvez utiliser pour vous connecter à une machine Linux, comme une instance Amazon EC2.
2.1 Signature d'un message
Il y a déjà une clé/cert d'exemple et un fichier source e-mail dans le répertoire des tests pour alice@example.com, donc vous pouvez obtenir une sortie même avant d'avoir vos propres clés. Tapez simplement ce qui suit :
cd tests ../sparkpostSMIME.py example_email1.eml --sign
Et vous obtiendrez :
À : Bob <bob@example.com> De : Alice <alice@example.com> Sujet : Un 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 d'e-mails depuis example.com via SparkPost à moins que vous ne possédiez ce domaine, donc l'étape suivante consiste à utiliser votre propre clé et à envoyer un message signé depuis votre propre domaine.
3. Envoyer un message signé via SparkPost
Maintenant, utilisons un vrai domaine d'envoi, configuré comme indiqué dans le guide de nouvel utilisateur SparkPost. Nous avons les fichiers de certificat et de clé d'expéditeur 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 De : pour convenir à votre propre domaine d'envoi et l'adresse À : pour convenir à votre destinataire de test. Le début du fichier ressemble à ceci :
À : Bob <bob.lumreeker@gmail.com> De : Steve <steve@thetucks.com> Sujet : 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 Quand au 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 :
Connexion ouverte à https://api.sparkpost.com/api/v1 Envoi de tests/declaration.eml De : Steve <steve@thetucks.com> À : Bob <bob.lumreeker@gmail.com> OK - en 1,15 secondes
Un peu plus d'une seconde 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 ce café, vous l'avez bien mérité. Si vous avez des problèmes, vérifiez que votre adresse De : 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 :
Attributs de sac nom convivial : 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 sujet=/emailAddress=bob.lumreeker@gmail.com émetteur=/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 existe un certificat de destinataire d'exemple pour bob@example.com dans le répertoire des tests, donc vous pouvez vous entraîner avec avant d'avoir un vrai certificat :
cd tests ../sparkpostSMIME.py example_email1.eml --sign --encrypt
Vous verrez :
À : Bob <bob@example.com> De : Alice <alice@example.com> Sujet : Un 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 bien plus longue que pour un message chiffré car elle contient beaucoup de informations supplémentaires ainsi que le message brouillé lui-même.
4.1 Envoi d'un message chiffré et signé via SparkPost
Envoyons un message chiffré à une vraie 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 / certificat pour vos propres adresses de destinataire. Vous avez seulement besoin du fichier .crt – le destinataire n'a jamais besoin de vous donner sa clé privée (.p12 et .pem).
J'ai le fichier bob.lumreeker@gmail.com.crt pour mon destinataire prévu – correspondant à l'adresse De : 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 de tests/declaration.eml De : Steve <steve@thetucks.com> À : Bob <bob.lumreeker@gmail.com> OK - en 1,168 secondes
Le mail apparaît dans Thunderbird avec l'icône de signature "point rouge" et l'icône "cadenas" chiffrée.
Vous pouvez envoyer des e-mails basés sur HTML complexes 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 externes et des images dans des messages S/MIME chiffrés, mais les messages uniquement signés s'affichent bien dans des clients comme Thunderbird et Gmail :
Notez que le menu déroulant indique "Adresse e-mail vérifiée".
Réflexions supplémentaires & choses à prendre en compte
Cet outil adopte une approche super simple pour rassembler les clés nécessaires – il recherche simplement les fichiers nommés dans le répertoire actuel. Des arrangements plus complexes, comme le maintien 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 à des fins d'archivage. Les messages signés sont reçus et peuvent être affichés par d'autres destinataires avec la signature. L'outil supprime l'en-tête Bcc : du message livré (comme le ferait un client de messagerie de bureau).
Pour s'assurer que les messages passent par SparkPost sans changement (ce qui pourrait casser la signature), l'outil définit des options API pour l'envoi "transactionnel", avec le suivi des ouvertures et des clics désactivé.
Si vous utilisez le chiffrement, gardez à l'esprit que l'outil prend la seule adresse À : pour cela. Les autres destinataires peuvent décoder le corps du message uniquement s'ils ont la clé privée du destinataire À : Si vous utilisez simplement des destinataires secondaires comme enregistrement des livraisons effectuées, par exemple, cela peut de toute façon être acceptable.
Signé, scellé livré… Je suis à vous
C'est notre rapide aperçu de la manière de signer, sceller et livrer des messages S/MIME via SparkPost. Petit rappel : le projet de démonstration est sur Github ici, j'ai essayé de le rendre facile à installer et à utiliser.
Fonctionnalité bonus : affichage des parties MIME avec "mimeshow"
Les fichiers MIME multipart RFC822 sont assez complexes à lire pour les humains. Le projet comprend un outil autonome pour rendre cela plus facile, appelé mimeshow.
Cela prend tous les fichiers e-mail 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 Test des pièces jointes, 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 un humain de la sortie sparkpostSMIME :
./sparkpostSMIME.py tests/declaration.eml --sign --encrypt | ./mimeshow.py
Vous verrez :
À Bob <bob.lumreeker@gmail.com> De Steve <steve@thetucks.com> Sujet Voici notre déclaration 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ésumer – nous avons installé quelques outils simples en ligne de commande pour signer et chiffrer des e-mails (le dépôt Github est ici, complet avec des instructions d'installation).
Nous avons obtenu notre clé / certificat d'expéditeur pour la signature et avons 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 fichiers d’e-mail internes.
Voilà, c'est tout pour le moment ! À bientôt !.