S/MIME Deel 4: Gemakkelijk publieke sleutels van ontvangers verzamelen - met SparkPost Inbound Relay Webhooks

S/MIME Deel 4: Gemakkelijk publieke sleutels van ontvangers verzamelen - met SparkPost Inbound Relay Webhooks

S/MIME Deel 4: Gemakkelijk publieke sleutels van ontvangers verzamelen - met SparkPost Inbound Relay Webhooks

Feb 1, 2019

Gepubliceerd door

Gepubliceerd door

MessageBird

MessageBird

-

Categorie:

Categorie:

E-mail

E-mail

Ready to see Bird
in action?

Ready to see Bird
in action?

S/MIME Part 4: Collecting Recipient Public Keys the Easy Way – with SparkPost Inbound Relay Webhooks

In deel 1, we had a quick tour of S/MIME, looking at signing and encryption of our message streams across a range of mail clients. Deel 2 took us through a simple command-line tool to sign and encrypt emails, then send them through SparkPost. Part 3 showed how to inject secure mail streams into on-premises platforms such as Haven25 PowerMTA and Momentum.

In deze serie hebben we gezien hoe het opnemen van een S/MIME-handtekening vrij eenvoudig is. Het versturen van S/MIME gecodeerde mail is ingewikkelder omdat u de publieke sleutels van de ontvanger moet verkrijgen. Het is één ding wanneer u een mailclient voor mensen gebruikt zoals Thunderbird - maar hoe werkt dat met app-gegenereerde e-mailstromen?


Maar wacht - er is een andere weg naar Mordor om die sleutels te krijgen. Je service kan je klanten uitnodigen (via email, natuurlijk) om je een ondertekende mail terug te sturen naar een bekend klantenservice adres. Met behulp van de magische krachten van SparkPost Inbound Relay webhooks, halen we die publieke sleutel eruit en slaan hem op zodat jij hem kunt gebruiken.


Wij kunnen dit samenvatten in een eenvoudige use-case:


  • Als ontvanger van berichten voorzie ik uw dienst van mijn persoonlijke e-mailhandtekening via e-mail, zodat in de toekomst e-mails in S/MIME-gecodeerde vorm naar mij kunnen worden verzonden.


Laten we hieruit enkele meer gedetailleerde eisen afleiden:


  • We hebben een altijd betrouwbare inkomende e-maildienst nodig om die ondertekende e-mails te ontvangen.

  • Er zijn geen speciale eisen voor het mailformaat, behalve dat het een S/MIME-handtekening moet bevatten.

  • Omdat iedereen kan proberen een mail naar deze dienst te sturen, moet hij defensief worden ontworpen, bijvoorbeeld om "spoof"-berichten van slechte actoren te weigeren. Er moeten verschillende controlelagen zijn.

  • If everything checks out OK, the service will store the certificate in a file, using the well-known plain-text Privacy-Enhanced Mail (PEM) format.


Er zijn enkele niet-functionele eisen:


  • Machine-to-machine webhook diensten kunnen moeilijk zijn om alleen aan de reacties te zien wat er binnenin gebeurt. De dienst zou uitgebreide, door mensen leesbare logs op applicatieniveau moeten leveren. Met name het parsen en controleren van certificaten moet worden gelogd.

  • We add test cases for the app internals, using the nice Pytest framework, and run those tests automatically on check-in using Travis CI integration with GitHub.


OK - laten we beginnen!


1. Overzicht van de oplossing

Zo ziet de totale oplossing eruit.


2. Installeren, configureren en starten van de web app

We beginnen met dit deel, zodat we het volledig getest hebben voordat we de inkomende relay webhooks gaan gebruiken.


De web app is included in the same GitHub project as parts 1 – 3, so if you’ve followed those parts, you already have it. Here are the new bits:


  • Programma readSMIMEsig.py - leest een e-mail en parseert tussen- en gebruikerscertificaten.

  • Programma webapp.py - eenvoudige Flask-compatibele webapplicatie voor gebruik met SparkPost Inbound Relay Webhooks.

  • webapp.ini - configuratiebestand voor het bovenstaande. Met een configuratiebestand kunnen dezelfde waarden gemakkelijk worden doorgegeven aan zowel commandoregel- als webapplicaties.


You need to ensure your host has the correct TCP port number open to inbound requests from the outside world so that SparkPost can POST messages to your app. If you’re hosted on AWS EC2, for example, you’ll need to configure the Veiligheidsgroep of your instance.


Instructions for configuring and starting the web app are given here – it’s quite easy. To check your app is running and accessible from the outside world, you can send (blank) requests from another host using curl, for example:

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

U zou een antwoord moeten zien zoals:

{"message":"Unknown Content-Type in request headers"}

Dit is goed - uw app draait!


In webapp.log op uw host ziet u uitvoer die hierop lijkt:

2019-01-15 00:11:07,575,root,INFO,Request from 38.96.5.10,scheme=https,path=/ 2019-01-15 00:11:07,575,root,INFO,| len(headers)=3,len(body)=None 2019-01-15 00:11:07,575,root,INFO,| Unknown Content-Type: Geen


To help you play with real data in your app straight away, you can import this specific Verzoek van de postbode from the project repo. This simulates what your SparkPost account will be doing, i.e. it sends an https POST containing an email with a specific, valid certificate (belonging to a test account of mine) to your app.


U hoeft alleen het doeladres in het verzoek (in het grijze vak hierboven) aan te passen aan uw installatie. Als je de tokenwaarde in webapp.ini hebt veranderd, pas dan ook de headerwaarde in Postman aan.


Als uw app werkt, ziet u een "200 OK" antwoord terug in Postman. Uw host webapp.log bestand zal output als deze bevatten:

2019-01-15 00:11:48,554,root,INFO,Request from 38.96.5.10,scheme=https,path=/ 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 passed 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,| Certificate: subject 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,| Certificate: subject 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,| written file ./bob.lumreeker@gmail.com.crt,bytes=1870,ok=True


Voor een snelle controle, kijk naar de laatste regel - als er staat "geschreven bestand", dan zit je goed. De rest laat de DKIM controle en het certificaat validatieproces zien.


3. SparkPost inbound relay webhooks setup

Firstly, we select a domain to use as our inbound message address –  here, it will be inbound.thetucks.com. Set your domain up following this guide. Here are the steps I used in detail:


3.1 MX Records toevoegen

U moet toegang hebben tot uw specifieke Internet Service Provider account. Als u klaar bent, kunt u ze controleren met dig - hier is het commando voor mijn domein.

dig +short MX inbound.thetucks.com

Moet je zien:

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


3.2 Een inkomend domein creëren

Use the SparkPost Postman API collectie, selecting the Inbound Domains / Create .. call. De body of the POST request contains your domain, for example:

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


3.3 Een Relay Webhook aanmaken

Maak een inkomende relay webhook met behulp van de relevante Postman oproep. Het bericht bevat in mijn geval:

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

As mentioned before, I recommend het instellen van een auth_token to your own secret value, as set in the webapp.ini file on your host.

Uw "doel"-waarde moet overeenkomen met uw hostadres en TCP-poort waar u de web-app zult hosten.

Uw "domein" waarde moet overeenkomen met uw MX records ingesteld in stap 1.



Dat is het! Het sanitair is klaar. U zou nu certificaten moeten kunnen sturen naar uw inkomend adres, ze zullen worden verwerkt en verschijnen op de host van uw webapplicatie - in dit geval een bestand met de naam bob.lumreeker@gmail.com.crt.

Now you can send encrypted emails to Bob, using the tools described in parts 2 & 3 of this series.

U kunt de inhoud van een certificaat onderzoeken met:

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


4. Intern: DKIM-controle, certificaatvalidatie

The app checks received emails have valid DKIM and checks that the certificates themselves are valid, as described here. There are implementation notes in there too, and ideas for further work.


Samenvattend...

We hebben gezien hoe publieke sleutels van ontvangers gemakkelijk kunnen worden verzameld met een e-mail naar een inkomend relay webhooks adres. Zodra dat is gebeurd, kunnen die ontvangers hun berichten in S/MIME gecodeerde vorm ontvangen.

Dat is het voor nu! Gelukkige verzending.

Your new standard in Marketing, Pay & Sales. It's Bird

The right message -> naar de right person -> aan de right time.

Your new standard in Marketing, Pay & Sales. It's Bird

The right message -> naar de right person -> aan de right time.