S/MIME del 4: Samla in mottagarens offentliga nycklar på ett enkelt sätt - med SparkPost Inbound Relay Webhooks

S/MIME del 4: Samla in mottagarens offentliga nycklar på ett enkelt sätt - med SparkPost Inbound Relay Webhooks

S/MIME del 4: Samla in mottagarens offentliga nycklar på ett enkelt sätt - med SparkPost Inbound Relay Webhooks

Feb 1, 2019

Publicerad av

Publicerad av

Bird

Bird

Kategori:

Kategori:

E-post

E-post

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 del 1, we had a quick tour of S/MIME, looking at signing and encryption of our message streams across a range of mail clients. Del 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 Port25 PowerMTA and Momentum.

I den här serien har vi sett att det är ganska enkelt att inkludera en S/MIME-signatur. Att skicka S/MIME-krypterad e-post är mer komplicerat eftersom du måste skaffa mottagarens publika nycklar. Det är en sak när du använder en e-postklient för människor som Thunderbird - men hur kan det fungera med appgenererade e-postströmmar?


Men vänta - det finns en annan väg in i Mordor för att få tag på nycklarna. Din tjänst kan bjuda in dina kunder (via e-post, naturligtvis) att skicka tillbaka ett signerat e-postmeddelande till en känd kundtjänstadress. Med hjälp av de magiska krafterna i SparkPost Inbound Relay webhooks extraherar och lagrar vi den offentliga nyckeln så att du kan använda den.


Vi kan sammanfatta detta i ett enkelt användningsfall:


  • Som mottagare av meddelanden förser jag din tjänst med min personliga e-postsignatur via e-post, så att e-post i framtiden kan skickas till mig i S/MIME-krypterad form.


Utifrån detta kan vi härleda några mer detaljerade krav:


  • Vi behöver en tillförlitlig tjänst för inkommande e-post som alltid är aktiverad för att ta emot dessa signerade e-postmeddelanden.

  • Det bör inte finnas några särskilda krav på e-postformatet, annat än att det ska innehålla en S/MIME-signatur.

  • Eftersom vem som helst kan försöka skicka ett e-postmeddelande till denna tjänst bör den utformas defensivt, till exempel för att avvisa "spoof"-meddelanden från dåliga aktörer. Det kommer att behövas flera lager av kontroller.

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


Det finns några icke-funktionella krav:


  • Webhook-tjänster från maskin till maskin kan vara svåra att se bara utifrån svaren på vad som händer inuti. Tjänsten bör tillhandahålla omfattande loggar på applikationsnivå som är läsbara för människor. I synnerhet bör parsing och kontroll av certifikat loggas.

  • 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 - nu sätter vi igång!


1. Översikt över lösningen

Så här kommer den övergripande lösningen att se ut.


2. Installera, konfigurera och starta webbappen

Vi börjar med den här delen, så att vi har den helt testad innan vi sätter igång webhooks för inkommande reläer.


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


  • Programmet readSMIMEsig.py - läser ett e-postmeddelande och analyserar mellanliggande certifikat och användarcertifikat.

  • Program webapp.py - enkel Flask-kompatibel webbapplikation för användning med SparkPost Inbound Relay Webhooks.

  • webapp.ini - konfigurationsfil för ovanstående. En konfigurationsfil gör det enkelt att skicka samma värden till både kommandorads- och webbapplikationer.


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 Säkerhetsgruppen 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/

Du bör se ett svar som t.ex:

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

Detta är bra - din app körs!


I webapp.log på din värd kommer du att se utdata som liknar detta:

2019-01-15 00:11:07,575,root,INFO,Begäran från 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,| Okänd Content-Type: Ingen


To help you play with real data in your app straight away, you can import this specific Begäran från brevbärare 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.


Du behöver bara ändra måladressen i begäran (i den grå rutan ovan) så att den matchar din installation. Om du ändrade token-värdet i webapp.ini, justera header-värdet i Postman så att det matchar.


Om din app fungerar kommer du att se ett "200 OK"-svar tillbaka i Postman. Din host webapp.log-fil kommer att innehålla utdata som denna:

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


För en snabb sanitetskontroll, titta efter den sista raden - om det står "skriven fil", då är det bra. Resten av detta visar DKIM-kontrollen och certifikatvalideringsprocessen.


3. SparkPost inkommande relä webhooks konfiguration

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 Lägg till MX-poster

Du behöver tillgång till ditt specifika Internetleverantörskonto. När du är klar kan du kontrollera dem med dig - här är kommandot för min domän.

dig +short MX inbound.thetucks.com

Du bör se:

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


3.2 Skapa en inkommande domän

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

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


3.3 Skapa en Webhook för reläer

Skapa en inkommande relä-webhook med hjälp av det relevanta Postman-anropet. Meddelandet i mitt fall innehåller:

{ "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 ange ett auth_token to your own secret value, as set in the webapp.ini file on your host.

Ditt "target"-värde måste matcha din värdadress och TCP-porten där du kommer att hosta webbappen.

Ditt "domän"-värde måste matcha dina MX-poster som sattes upp i steg 1.



Nu är det klart! Rörmokeriet är klart. Du bör nu kunna skicka certifikat till din inkommande adress, de kommer att behandlas och dyka upp på din webbapplikations värd - i det här fallet en fil med namnet bob.lumreeker@gmail.com.crt.

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

Du kan granska innehållet i ett certifikat med hjälp av:

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


4. Interna funktioner: DKIM-kontroll, validering av certifikat

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.


Sammanfattningsvis...

Vi har sett hur mottagarnas offentliga nycklar enkelt kan samlas in med hjälp av ett e-postmeddelande till en inkommande relay webhooks-adress. När detta är gjort kan mottagarna få sina meddelanden i S/MIME-krypterad form.

Det var allt för den här gången! Trevlig sändning.

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

The right message -> till right person -> vid right time.

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

The right message -> till right person -> vid right time.