S/MIME Partie 4 : Collecte des clés publiques des destinataires facilement – avec les webhooks de relais entrant SparkPost

Email

1 min read

S/MIME Partie 4 : Collecte des clés publiques des destinataires facilement – avec les webhooks de relais entrant SparkPost

Email

1 min read

S/MIME Partie 4 : Collecte des clés publiques des destinataires facilement – avec les webhooks de relais entrant SparkPost

Dans cette série, nous avons vu que l'inclusion d'une signature S/MIME est assez simple. L'envoi de courriels cryptés S/MIME est plus complexe car vous devez obtenir les clés publiques des destinataires. C'est une chose lorsque vous utilisez un client de messagerie pour les humains tel que Thunderbird – mais comment cela peut-il fonctionner avec des flux de courriels générés par des applications ?

Dans la partie 1, nous avons fait un tour rapide de S/MIME, en examinant la signature et le cryptage de nos flux de messages à travers une gamme de clients de messagerie. La partie 2 nous a montré un outil simple en ligne de commande pour signer et crypter les e-mails, puis les envoyer via SparkPost. La partie 3 a démontré comment injecter des flux de courrier sécurisé sur des plateformes locales telles que Port25 PowerMTA et Momentum.

Dans cette série, nous avons vu qu'inclure une signature S/MIME est assez simple. Envoyer des mails chiffrés S/MIME est plus complexe car il est nécessaire d'obtenir les clés publiques des destinataires. C'est une chose lorsque vous utilisez un client de messagerie pour les humains comme Thunderbird, mais comment cela fonctionne-t-il avec des flux de courrier générés par des applications?

Mais attendez – il y a une autre façon d'entrer dans Mordor pour obtenir ces clés. Votre service peut inviter vos clients (par email, bien sûr) à vous renvoyer un mail signé à une adresse de service client connue. En utilisant les pouvoirs magiques de SparkPost Inbound Relay webhooks, nous extrairons et stockerons cette clé publique pour votre usage.

Nous pouvons résumer cela dans un cas d'utilisation simple :

  • En tant que destinataire de messages, je fournis à votre service ma signature email personnelle via email, afin que, à l'avenir, les emails puissent m'être envoyés sous forme chiffrée S/MIME.

À partir de cela, dérivons quelques exigences plus détaillées :




  • Nous avons besoin d'un service de messagerie entrant toujours disponible et fiable pour recevoir ces e-mails signés.

  • Il ne devrait y avoir aucune exigence particulière sur le format du courrier, autre que le fait qu'il devrait comporter une signature S/MIME.

  • Étant donné que n'importe qui peut essayer d'envoyer un email à ce service, il devrait être conçu de manière défensive, par exemple pour rejeter les messages "spoof" de mauvais acteurs. Il faudra plusieurs couches de vérification.

  • Si tout est en ordre, le service stockera le certificat dans un fichier, en utilisant le format bien connu de texte brut Privacy-Enhanced Mail (PEM).

Il y a quelques exigences non fonctionnelles :

  • Les services de webhook machine-à-machine peuvent être difficiles à comprendre simplement à partir des réponses sur ce qui se passe à l'intérieur. Le service devrait fournir des logs au niveau de l'application, lisibles par l'homme. En particulier, l'analyse et la vérification des certificats doivent être consignées.

  • Nous ajoutons des cas de test pour les internes de l'application, en utilisant le joli cadre Pytest, et nous exécutons ces tests automatiquement au moment de l'enregistrement en utilisant l'intégration Travis CI avec GitHub.

D'accord – commençons !

1. Aperçu de la solution

Voici à quoi ressemblera la solution globale.

2. Installer, configurer et démarrer l'application web

Nous allons commencer par cette partie, afin de la tester complètement avant de mettre en place les webhooks de relais entrant.

L'application web est incluse dans le même projet GitHub que les parties 1 à 3, donc si vous avez suivi ces parties, vous l'avez déjà. Voici les nouvelles parties :

  • Programme readSMIMEsig.py – lire un email et analyser les certificats intermédiaires et d'utilisateur.

  • Programme webapp.py – application web simple compatible Flask pour une utilisation avec les Webhooks de Relais Entrant SparkPost.

  • webapp.ini – fichier de configuration pour ce qui précède. Un fichier de config permet de passer facilement les mêmes valeurs aux applications en ligne de commande et web.




Vous devez vous assurer que votre hôte dispose du bon numéro de port TCP ouvert aux demandes entrantes du monde extérieur pour que SparkPost puisse envoyer des messages POST à votre application. Par exemple, si vous êtes hébergé sur AWS EC2, vous devrez configurer le Groupe de Sécurité de votre instance.

Des instructions pour configurer et démarrer l'application web sont données ici – c'est assez facile. Pour vérifier que votre application fonctionne et est accessible depuis le monde extérieur, vous pouvez envoyer des requêtes (vides) depuis un autre hôte en utilisant curl, par exemple :

curl -X POST https://app.trymsys.net:8855/

Vous devriez voir une réponse telle que :

{"message":"Content-Type inconnu dans les en-têtes de la requête"}

C'est une bonne chose – votre application fonctionne !

Dans webapp.log sur votre hôte, vous verrez une sortie similaire à celle-ci :

2019-01-15 00:11:07,575,root,INFO,Requête de 38.96.5.10,schéma=https,chemin=/ 2019-01-15 00:11:07,575,root,INFO,| len(headers)=3,len(body)=None 2019-01-15 00:11:07,575,root,INFO,| Content-Type inconnu: None

Pour vous aider à jouer avec des données réelles dans votre application immédiatement, vous pouvez importer cette requête Postman spécifique depuis le dépôt du projet. Cela simule ce que fera votre compte SparkPost, c'est-à-dire qu'il envoie un POST https contenant un email avec un certificat spécifique et valide (appartenant à un compte de test à moi) à votre application.

Vous n'avez qu'à changer l'adresse cible dans la requête (dans la boîte grise ci-dessus) pour qu'elle corresponde à votre installation. Si vous avez changé la valeur du token dans webapp.ini, ajustez la valeur de l'en-tête dans Postman pour qu'elle concorde.

Si votre application fonctionne, vous verrez une réponse « 200 OK » de retour dans Postman. Votre fichier webapp.log sur l'hôte contiendra une sortie comme ceci :

2019-01-15 00:11:48,554,root,INFO,Requête de 38.96.5.10,schéma=https,chemin=/ 2019-01-15 00:11:48,554,root,INFO,| len(headers)=10,len(body)=14778 2019-01-15 00:11:48,555,root,INFO,| msg_from=bob.lumreeker@gmail.com,rcpt_to=secureme@inbound.thetucks.com,len(email_rfc822)=9223 2019-01-15 00:11:48,599,root,INFO,| from=bob.lumreeker@gmail.com,DKIM passé 2019-01-15 00:11:48,600,root,INFO,| content-type=multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="------------ms010908020707040304020406",content-description=None 2019-01-15 00:11:48,600,root,INFO,| content-type=text/plain; charset=utf-8; format=flowed,content-description=None 2019-01-15 00:11:48,600,root,INFO,| content-type=application/pkcs7-signature; name="smime.p7s",content-description=S/MIME Cryptographic Signature 2019-01-15 00:11:48,600,root,INFO,| filename=smime.p7s,bytes=3998 2019-01-15 00:11:48,601,root,INFO,| Certificat : email_address=['bob.lumreeker@gmail.com'],not_valid_before=2018-10-03 00:00:00,not_valid_after=2019-10-03 23:59:59,hash_algorithm=sha256,key_size=2048 bytes, issuer={'countryName': 'GB', 'stateOrProvinceName': 'Greater Manchester', 'localityName': 'Salford', 'organizationName': 'COMODO CA Limited', 'commonName': 'COMODO RSA Client Authentication and Secure Email CA'} 2019-01-15 00:11:48,602,root,INFO,| Certificat : email_address=[],not_valid_before=2013-01-10 00:00:00,not_valid_after=2028-01-09 23:59:59,hash_algorithm=sha384,key_size=2048 bytes, issuer={'countryName': 'GB', 'stateOrProvinceName': 'Greater Manchester', 'localityName': 'Salford', 'organizationName': 'COMODO CA Limited', 'commonName': 'COMODO RSA Certification Authority'} 2019-01-15 00:11:48,616,root,INFO,| fichier écrit ./bob.lumreeker@gmail.com.crt,bytes=1870,ok=True

Pour une vérification rapide, cherchez la dernière ligne – si elle indique « fichier écrit », alors tout va bien. Le reste montre le processus de vérification DKIM et de validation des certificats.

Nous allons commencer par cette partie, afin de la tester complètement avant de mettre en place les webhooks de relais entrant.

L'application web est incluse dans le même projet GitHub que les parties 1 à 3, donc si vous avez suivi ces parties, vous l'avez déjà. Voici les nouvelles parties :

  • Programme readSMIMEsig.py – lire un email et analyser les certificats intermédiaires et d'utilisateur.

  • Programme webapp.py – application web simple compatible Flask pour une utilisation avec les Webhooks de Relais Entrant SparkPost.

  • webapp.ini – fichier de configuration pour ce qui précède. Un fichier de config permet de passer facilement les mêmes valeurs aux applications en ligne de commande et web.




Vous devez vous assurer que votre hôte dispose du bon numéro de port TCP ouvert aux demandes entrantes du monde extérieur pour que SparkPost puisse envoyer des messages POST à votre application. Par exemple, si vous êtes hébergé sur AWS EC2, vous devrez configurer le Groupe de Sécurité de votre instance.

Des instructions pour configurer et démarrer l'application web sont données ici – c'est assez facile. Pour vérifier que votre application fonctionne et est accessible depuis le monde extérieur, vous pouvez envoyer des requêtes (vides) depuis un autre hôte en utilisant curl, par exemple :

curl -X POST https://app.trymsys.net:8855/

Vous devriez voir une réponse telle que :

{"message":"Content-Type inconnu dans les en-têtes de la requête"}

C'est une bonne chose – votre application fonctionne !

Dans webapp.log sur votre hôte, vous verrez une sortie similaire à celle-ci :

2019-01-15 00:11:07,575,root,INFO,Requête de 38.96.5.10,schéma=https,chemin=/ 2019-01-15 00:11:07,575,root,INFO,| len(headers)=3,len(body)=None 2019-01-15 00:11:07,575,root,INFO,| Content-Type inconnu: None

Pour vous aider à jouer avec des données réelles dans votre application immédiatement, vous pouvez importer cette requête Postman spécifique depuis le dépôt du projet. Cela simule ce que fera votre compte SparkPost, c'est-à-dire qu'il envoie un POST https contenant un email avec un certificat spécifique et valide (appartenant à un compte de test à moi) à votre application.

Vous n'avez qu'à changer l'adresse cible dans la requête (dans la boîte grise ci-dessus) pour qu'elle corresponde à votre installation. Si vous avez changé la valeur du token dans webapp.ini, ajustez la valeur de l'en-tête dans Postman pour qu'elle concorde.

Si votre application fonctionne, vous verrez une réponse « 200 OK » de retour dans Postman. Votre fichier webapp.log sur l'hôte contiendra une sortie comme ceci :

2019-01-15 00:11:48,554,root,INFO,Requête de 38.96.5.10,schéma=https,chemin=/ 2019-01-15 00:11:48,554,root,INFO,| len(headers)=10,len(body)=14778 2019-01-15 00:11:48,555,root,INFO,| msg_from=bob.lumreeker@gmail.com,rcpt_to=secureme@inbound.thetucks.com,len(email_rfc822)=9223 2019-01-15 00:11:48,599,root,INFO,| from=bob.lumreeker@gmail.com,DKIM passé 2019-01-15 00:11:48,600,root,INFO,| content-type=multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="------------ms010908020707040304020406",content-description=None 2019-01-15 00:11:48,600,root,INFO,| content-type=text/plain; charset=utf-8; format=flowed,content-description=None 2019-01-15 00:11:48,600,root,INFO,| content-type=application/pkcs7-signature; name="smime.p7s",content-description=S/MIME Cryptographic Signature 2019-01-15 00:11:48,600,root,INFO,| filename=smime.p7s,bytes=3998 2019-01-15 00:11:48,601,root,INFO,| Certificat : email_address=['bob.lumreeker@gmail.com'],not_valid_before=2018-10-03 00:00:00,not_valid_after=2019-10-03 23:59:59,hash_algorithm=sha256,key_size=2048 bytes, issuer={'countryName': 'GB', 'stateOrProvinceName': 'Greater Manchester', 'localityName': 'Salford', 'organizationName': 'COMODO CA Limited', 'commonName': 'COMODO RSA Client Authentication and Secure Email CA'} 2019-01-15 00:11:48,602,root,INFO,| Certificat : email_address=[],not_valid_before=2013-01-10 00:00:00,not_valid_after=2028-01-09 23:59:59,hash_algorithm=sha384,key_size=2048 bytes, issuer={'countryName': 'GB', 'stateOrProvinceName': 'Greater Manchester', 'localityName': 'Salford', 'organizationName': 'COMODO CA Limited', 'commonName': 'COMODO RSA Certification Authority'} 2019-01-15 00:11:48,616,root,INFO,| fichier écrit ./bob.lumreeker@gmail.com.crt,bytes=1870,ok=True

Pour une vérification rapide, cherchez la dernière ligne – si elle indique « fichier écrit », alors tout va bien. Le reste montre le processus de vérification DKIM et de validation des certificats.

Nous allons commencer par cette partie, afin de la tester complètement avant de mettre en place les webhooks de relais entrant.

L'application web est incluse dans le même projet GitHub que les parties 1 à 3, donc si vous avez suivi ces parties, vous l'avez déjà. Voici les nouvelles parties :

  • Programme readSMIMEsig.py – lire un email et analyser les certificats intermédiaires et d'utilisateur.

  • Programme webapp.py – application web simple compatible Flask pour une utilisation avec les Webhooks de Relais Entrant SparkPost.

  • webapp.ini – fichier de configuration pour ce qui précède. Un fichier de config permet de passer facilement les mêmes valeurs aux applications en ligne de commande et web.




Vous devez vous assurer que votre hôte dispose du bon numéro de port TCP ouvert aux demandes entrantes du monde extérieur pour que SparkPost puisse envoyer des messages POST à votre application. Par exemple, si vous êtes hébergé sur AWS EC2, vous devrez configurer le Groupe de Sécurité de votre instance.

Des instructions pour configurer et démarrer l'application web sont données ici – c'est assez facile. Pour vérifier que votre application fonctionne et est accessible depuis le monde extérieur, vous pouvez envoyer des requêtes (vides) depuis un autre hôte en utilisant curl, par exemple :

curl -X POST https://app.trymsys.net:8855/

Vous devriez voir une réponse telle que :

{"message":"Content-Type inconnu dans les en-têtes de la requête"}

C'est une bonne chose – votre application fonctionne !

Dans webapp.log sur votre hôte, vous verrez une sortie similaire à celle-ci :

2019-01-15 00:11:07,575,root,INFO,Requête de 38.96.5.10,schéma=https,chemin=/ 2019-01-15 00:11:07,575,root,INFO,| len(headers)=3,len(body)=None 2019-01-15 00:11:07,575,root,INFO,| Content-Type inconnu: None

Pour vous aider à jouer avec des données réelles dans votre application immédiatement, vous pouvez importer cette requête Postman spécifique depuis le dépôt du projet. Cela simule ce que fera votre compte SparkPost, c'est-à-dire qu'il envoie un POST https contenant un email avec un certificat spécifique et valide (appartenant à un compte de test à moi) à votre application.

Vous n'avez qu'à changer l'adresse cible dans la requête (dans la boîte grise ci-dessus) pour qu'elle corresponde à votre installation. Si vous avez changé la valeur du token dans webapp.ini, ajustez la valeur de l'en-tête dans Postman pour qu'elle concorde.

Si votre application fonctionne, vous verrez une réponse « 200 OK » de retour dans Postman. Votre fichier webapp.log sur l'hôte contiendra une sortie comme ceci :

2019-01-15 00:11:48,554,root,INFO,Requête de 38.96.5.10,schéma=https,chemin=/ 2019-01-15 00:11:48,554,root,INFO,| len(headers)=10,len(body)=14778 2019-01-15 00:11:48,555,root,INFO,| msg_from=bob.lumreeker@gmail.com,rcpt_to=secureme@inbound.thetucks.com,len(email_rfc822)=9223 2019-01-15 00:11:48,599,root,INFO,| from=bob.lumreeker@gmail.com,DKIM passé 2019-01-15 00:11:48,600,root,INFO,| content-type=multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="------------ms010908020707040304020406",content-description=None 2019-01-15 00:11:48,600,root,INFO,| content-type=text/plain; charset=utf-8; format=flowed,content-description=None 2019-01-15 00:11:48,600,root,INFO,| content-type=application/pkcs7-signature; name="smime.p7s",content-description=S/MIME Cryptographic Signature 2019-01-15 00:11:48,600,root,INFO,| filename=smime.p7s,bytes=3998 2019-01-15 00:11:48,601,root,INFO,| Certificat : email_address=['bob.lumreeker@gmail.com'],not_valid_before=2018-10-03 00:00:00,not_valid_after=2019-10-03 23:59:59,hash_algorithm=sha256,key_size=2048 bytes, issuer={'countryName': 'GB', 'stateOrProvinceName': 'Greater Manchester', 'localityName': 'Salford', 'organizationName': 'COMODO CA Limited', 'commonName': 'COMODO RSA Client Authentication and Secure Email CA'} 2019-01-15 00:11:48,602,root,INFO,| Certificat : email_address=[],not_valid_before=2013-01-10 00:00:00,not_valid_after=2028-01-09 23:59:59,hash_algorithm=sha384,key_size=2048 bytes, issuer={'countryName': 'GB', 'stateOrProvinceName': 'Greater Manchester', 'localityName': 'Salford', 'organizationName': 'COMODO CA Limited', 'commonName': 'COMODO RSA Certification Authority'} 2019-01-15 00:11:48,616,root,INFO,| fichier écrit ./bob.lumreeker@gmail.com.crt,bytes=1870,ok=True

Pour une vérification rapide, cherchez la dernière ligne – si elle indique « fichier écrit », alors tout va bien. Le reste montre le processus de vérification DKIM et de validation des certificats.

3. Configuration des webhooks de relais entrant SparkPost

Tout d'abord, nous sélectionnons un domaine à utiliser comme notre adresse de message entrant – ici, ce sera inbound.thetucks.com. Configurez votre domaine en suivant ce guide. Voici les étapes que j'ai utilisées en détail :




3.1 Ajouter des enregistrements MX

Vous aurez besoin d'accéder à votre compte fournisseur de services Internet spécifique. Une fois fait, vous pouvez les vérifier avec dig – voici la commande pour mon domaine.

dig +short MX inbound.thetucks.com

Vous devriez voir :

10 rx3.sparkpostmail.com. 10 rx1.sparkpostmail.com. 10 rx2.sparkpostmail.com.




3.2 Créer un domaine entrant

Utilisez la collection API Postman de SparkPost, en sélectionnant l'appel Inbound Domains / Create. Le corps de la requête POST contient votre domaine, par exemple :

{    "domain": "inbound.thetucks.com" }




3.3 Créer un Webhook de relais

Créez un webhook de relais entrant en utilisant l'appel Postman pertinent. Le corps du message dans mon cas contient :

{ "name": "Certificate Collection Webhook", "target": "https://app.trymsys.net:8855/", "auth_token": "t0p s3cr3t t0k3n", "match": { "protocol": "SMTP", "domain": "inbound.thetucks.com" } }

Comme mentionné précédemment, je recommande de définir un auth_token à votre propre valeur secrète, telle que définie dans le fichier webapp.ini sur votre hôte.

Votre valeur "target" doit correspondre à l'adresse de votre hôte et au port TCP où vous hébergerez l'application web.

Votre valeur "domain" doit correspondre à vos enregistrements MX configurés à l'étape 1.







C'est fait ! La plomberie est terminée. Vous devriez maintenant pouvoir envoyer des certificats à votre adresse entrante, ils seront traités et apparaîtront sur votre hôte d'application web – dans ce cas, un fichier nommé bob.lumreeker@gmail.com.crt.

Maintenant, vous pouvez envoyer des e-mails cryptés à Bob, en utilisant les outils décrits dans les parties 2 et 3 de cette série.

Vous pouvez examiner le contenu d'un certificat en utilisant :

openssl x509 -inform PEM -in bob.lumreeker\@gmail.com.crt -text -noout

4. Internals : vérification DKIM, validation des certificats

L'application vérifie que les e-mails reçus ont un DKIM valide et vérifie que les certificats eux-mêmes sont valides, comme décrit ici. Il y a aussi des notes d'implémentation là-dedans, et des idées pour des travaux futurs.

En résumé…

Nous avons vu comment les clés publiques des destinataires peuvent être facilement collectées en utilisant un email vers une adresse de webhooks de relais entrant. Une fois cela fait, ces destinataires peuvent recevoir leurs messages sous forme chiffrée S/MIME.

C'est tout pour le moment ! Bon envoi.

Rejoignez notre Newsletter.

Restez à jour avec Bird grâce aux mises à jour hebdomadaires dans votre boîte de réception.

En soumettant, vous acceptez que Bird puisse vous contacter au sujet de nos produits et services.

Vous pouvez vous désabonner à tout moment. Consultez la Déclaration de confidentialité de Bird pour plus de détails sur le traitement des données.

Rejoignez notre Newsletter.

Restez à jour avec Bird grâce aux mises à jour hebdomadaires dans votre boîte de réception.

En soumettant, vous acceptez que Bird puisse vous contacter au sujet de nos produits et services.

Vous pouvez vous désabonner à tout moment. Consultez la Déclaration de confidentialité de Bird pour plus de détails sur le traitement des données.

Rejoignez notre Newsletter.

Restez à jour avec Bird grâce aux mises à jour hebdomadaires dans votre boîte de réception.

En soumettant, vous acceptez que Bird puisse vous contacter au sujet de nos produits et services.

Vous pouvez vous désabonner à tout moment. Consultez la Déclaration de confidentialité de Bird pour plus de détails sur le traitement des données.

Pinterest logo
Uber logo
Logo Square
Logo Adobe
Meta logo
logo PayPal

Company

Paramètres de confidentialité

Newsletter

Restez à jour avec Bird grâce aux mises à jour hebdomadaires dans votre boîte de réception.

En soumettant, vous acceptez que Bird puisse vous contacter au sujet de nos produits et services.

Vous pouvez vous désabonner à tout moment. Consultez la Déclaration de confidentialité de Bird pour plus de détails sur le traitement des données.

Uber logo
Logo Square
Logo Adobe
Meta logo

Company

Paramètres de confidentialité

Newsletter

Restez à jour avec Bird grâce aux mises à jour hebdomadaires dans votre boîte de réception.

En soumettant, vous acceptez que Bird puisse vous contacter au sujet de nos produits et services.

Vous pouvez vous désabonner à tout moment. Consultez la Déclaration de confidentialité de Bird pour plus de détails sur le traitement des données.

Uber logo
Logo Adobe
Meta logo

Reach

Grow

Manage

Automate

Resources

Company

Newsletter

Restez à jour avec Bird grâce aux mises à jour hebdomadaires dans votre boîte de réception.

En soumettant, vous acceptez que Bird puisse vous contacter au sujet de nos produits et services.

Vous pouvez vous désabonner à tout moment. Consultez la Déclaration de confidentialité de Bird pour plus de détails sur le traitement des données.