Bereik

Grow

Manage

Automate

Bereik

Grow

Manage

Automate

S/MIME Deel 4: Het eenvoudig verzamelen van ontvangers openbare sleutels – met SparkPost Inbound Relay Webhooks

E-mail

1 min read

S/MIME Deel 4: Het eenvoudig verzamelen van ontvangers openbare sleutels – met SparkPost Inbound Relay Webhooks

E-mail

1 min read

S/MIME Deel 4: Het eenvoudig verzamelen van ontvangers openbare sleutels – met SparkPost Inbound Relay Webhooks

In deze serie hebben we gezien hoe het toevoegen van een S/MIME-handtekening vrij eenvoudig is. Het verzenden van S/MIME-versleutelde e-mails is complexer omdat je openbare sleutels van de ontvanger moet verkrijgen. Het is één ding wanneer je een mailclient gebruikt voor mensen zoals Thunderbird – maar hoe werkt dat met app-gegeneerde e-mailstromen?

In deel 1 hadden we een snelle rondleiding van S/MIME, waarbij we keken naar het ondertekenen en versleutelen van onze berichtenstromen over een reeks mailclients. Deel 2 nam ons mee door een eenvoudige command-line tool om e-mails te ondertekenen en te versleutelen, en ze vervolgens via SparkPost te verzenden. Deel 3 liet zien hoe je veilige mailstromen kunt injecteren in on-premises platforms zoals Port25 PowerMTA en Momentum.

In deze serie hebben we gezien hoe het toevoegen van een S/MIME-handtekening vrij eenvoudig is. S/MIME-versleutelde mail versturen is complexer omdat je ontvangers openbare sleutels moet verkrijgen. Het is één ding als je een mailclient voor mensen zoals Thunderbird gebruikt – maar hoe kan dat werken met appgegenereerde e-mailstromen?

Maar wacht – er is een andere weg naar Mordor om die sleutels te krijgen. Je service kan je klanten uitnodigen (natuurlijk via e-mail) om je een ondertekende mail te sturen naar een bekend klantenserviceadres. Met de magische krachten van SparkPost Inbound Relay webhooks, zullen we die openbare sleutel voor jou extraheren en opslaan.

We kunnen dit samenvatten in een eenvoudig use-case:

  • Als ontvanger van berichten geef ik je service mijn persoonlijke e-mailhandtekening via e-mail, zodat in de toekomst e-mails in S/MIME-versleutelde vorm naar mij kunnen worden gestuurd.

Hiervan kunnen we enkele meer gedetailleerde vereisten afleiden:

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

  • Er mogen geen speciale vereisten zijn aan het mailformaat, behalve dat het een S/MIME-handtekening moet bevatten.

  • Aangezien iedereen probeert een mail naar deze service te sturen, moet deze defensief ontworpen zijn, bijvoorbeeld om "spoof"-berichten van kwaadwillende actoren af te wijzen. Er zullen meerdere lagen van controle nodig zijn.

  • Als alles goed wordt gecontroleerd, zal de service het certificaat opslaan in een bestand, gebruikmakend van de bekende plain-text Privacy-Enhanced Mail (PEM) formaat.

Er zijn enkele niet-functionele eisen:

  • Machine-tot-machine webhook services kunnen moeilijk te zien zijn alleen op basis van reacties op wat er intern gebeurt. De service moet uitgebreide mensleesbare applicatieniveau-logboeken verstrekken. In het bijzonder moeten het parsen en controleren van het certificaat worden gelogd.

  • We voegen testgevallen toe voor de internals van de app, gebruikmakend van het fraaie Pytest framework, en draaien deze tests automatisch bij inchecken via Travis CI integratie met GitHub.

OK – laten we beginnen!

1. Oplossingsoverzicht

Dit is hoe de algehele oplossing eruit zal zien.

Diagram depicting a secure email flow illustrating how emails are verified using certificates for secure transmission.

2. Installeren, configureren en starten van de web app

We beginnen met dit gedeelte, zodat we het volledig getest hebben voordat we de inkomende relay webhooks installeren.

De webapp is opgenomen in hetzelfde GitHub-project als delen 1 – 3, dus als je die delen hebt gevolgd, heb je het al. Hier zijn de nieuwe onderdelen:

  • Programma readSMIMEsig.py – lees een e-mail en haal tussenliggende en gebruikerscertificaten eruit.

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

  • webapp.ini – configuratiebestand voor het bovenstaande. Een configuratiebestand maakt het gemakkelijk dezelfde waarden door te geven aan zowel command-line als webapplicaties.

Je moet ervoor zorgen dat je host het juiste TCP-poortnummer heeft opengesteld voor inkomende verzoeken vanuit de buitenwereld, zodat SparkPost berichten naar je app kan POSTen. Als je bijvoorbeeld op AWS EC2 gehost wordt, moet je de Security Group van je instance configureren.

Instructies voor het configureren en starten van de webapp worden hier gegeven – het is vrij eenvoudig. Om te controleren of je app draait en toegankelijk is vanuit de buitenwereld, kun je (lege) verzoeken van een andere host verzenden met bijvoorbeeld curl:

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

Je zou een reactie moeten zien zoals:

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

Dit is een goed teken – je app draait!

In webapp.log op je host, zie je uitvoer die hierop lijkt:

2019-01-15 00:11:07,575,root,INFO,Verzoek van 38.96.5.10,scheme=https,pad=/ 2019-01-15 00:11:07,575,root,INFO,| len(headers)=3,len(body)=None 2019-01-15 00:11:07,575,root,INFO,| Onbekende Content-Type: None

Om je te helpen direct met echte gegevens in je app aan de slag te gaan, kun je dit specifieke Postman-verzoek importeren vanuit de projectrepo. Dit simuleert wat je SparkPost-account zal doen, d.w.z. het verzendt een https POST met daarin een e-mail met een specifiek, geldig certificaat (dat behoort tot een testaccount van mij) naar je app.

Je hoeft alleen het doeladres in het verzoek (in het grijze vak hierboven) te wijzigen zodat het overeenkomt met jouw installatie. Als je de tokenwaarde in webapp.ini hebt gewijzigd, pas dan de hoofdervalue in Postman aan om overeen te komen.

Als je app werkt, zie je een "200 OK" reactie terug in Postman. Je host webapp.log-bestand zal uitvoer bevatten zoals deze:

2019-01-15 00:11:48,554,root,INFO,Verzoek van 38.96.5.10,scheme=https,pad=/ 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,| van=bob.lumreeker@gmail.com,DKIM geslaagd 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,| Certificaat: 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,| Certificaat: 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,| geschreven bestand ./bob.lumreeker@gmail.com.crt,bytes=1870,ok=True

Voor een snelle controle, kijk naar de laatste regel – als er "geschreven bestand" staat, dan zit je goed. De rest van dit is het tonen van het DKIM-controle- en certificaatvalidatieproces.

We beginnen met dit gedeelte, zodat we het volledig getest hebben voordat we de inkomende relay webhooks installeren.

De webapp is opgenomen in hetzelfde GitHub-project als delen 1 – 3, dus als je die delen hebt gevolgd, heb je het al. Hier zijn de nieuwe onderdelen:

  • Programma readSMIMEsig.py – lees een e-mail en haal tussenliggende en gebruikerscertificaten eruit.

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

  • webapp.ini – configuratiebestand voor het bovenstaande. Een configuratiebestand maakt het gemakkelijk dezelfde waarden door te geven aan zowel command-line als webapplicaties.

Je moet ervoor zorgen dat je host het juiste TCP-poortnummer heeft opengesteld voor inkomende verzoeken vanuit de buitenwereld, zodat SparkPost berichten naar je app kan POSTen. Als je bijvoorbeeld op AWS EC2 gehost wordt, moet je de Security Group van je instance configureren.

Instructies voor het configureren en starten van de webapp worden hier gegeven – het is vrij eenvoudig. Om te controleren of je app draait en toegankelijk is vanuit de buitenwereld, kun je (lege) verzoeken van een andere host verzenden met bijvoorbeeld curl:

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

Je zou een reactie moeten zien zoals:

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

Dit is een goed teken – je app draait!

In webapp.log op je host, zie je uitvoer die hierop lijkt:

2019-01-15 00:11:07,575,root,INFO,Verzoek van 38.96.5.10,scheme=https,pad=/ 2019-01-15 00:11:07,575,root,INFO,| len(headers)=3,len(body)=None 2019-01-15 00:11:07,575,root,INFO,| Onbekende Content-Type: None

Om je te helpen direct met echte gegevens in je app aan de slag te gaan, kun je dit specifieke Postman-verzoek importeren vanuit de projectrepo. Dit simuleert wat je SparkPost-account zal doen, d.w.z. het verzendt een https POST met daarin een e-mail met een specifiek, geldig certificaat (dat behoort tot een testaccount van mij) naar je app.

Je hoeft alleen het doeladres in het verzoek (in het grijze vak hierboven) te wijzigen zodat het overeenkomt met jouw installatie. Als je de tokenwaarde in webapp.ini hebt gewijzigd, pas dan de hoofdervalue in Postman aan om overeen te komen.

Als je app werkt, zie je een "200 OK" reactie terug in Postman. Je host webapp.log-bestand zal uitvoer bevatten zoals deze:

2019-01-15 00:11:48,554,root,INFO,Verzoek van 38.96.5.10,scheme=https,pad=/ 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,| van=bob.lumreeker@gmail.com,DKIM geslaagd 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,| Certificaat: 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,| Certificaat: 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,| geschreven bestand ./bob.lumreeker@gmail.com.crt,bytes=1870,ok=True

Voor een snelle controle, kijk naar de laatste regel – als er "geschreven bestand" staat, dan zit je goed. De rest van dit is het tonen van het DKIM-controle- en certificaatvalidatieproces.

We beginnen met dit gedeelte, zodat we het volledig getest hebben voordat we de inkomende relay webhooks installeren.

De webapp is opgenomen in hetzelfde GitHub-project als delen 1 – 3, dus als je die delen hebt gevolgd, heb je het al. Hier zijn de nieuwe onderdelen:

  • Programma readSMIMEsig.py – lees een e-mail en haal tussenliggende en gebruikerscertificaten eruit.

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

  • webapp.ini – configuratiebestand voor het bovenstaande. Een configuratiebestand maakt het gemakkelijk dezelfde waarden door te geven aan zowel command-line als webapplicaties.

Je moet ervoor zorgen dat je host het juiste TCP-poortnummer heeft opengesteld voor inkomende verzoeken vanuit de buitenwereld, zodat SparkPost berichten naar je app kan POSTen. Als je bijvoorbeeld op AWS EC2 gehost wordt, moet je de Security Group van je instance configureren.

Instructies voor het configureren en starten van de webapp worden hier gegeven – het is vrij eenvoudig. Om te controleren of je app draait en toegankelijk is vanuit de buitenwereld, kun je (lege) verzoeken van een andere host verzenden met bijvoorbeeld curl:

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

Je zou een reactie moeten zien zoals:

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

Dit is een goed teken – je app draait!

In webapp.log op je host, zie je uitvoer die hierop lijkt:

2019-01-15 00:11:07,575,root,INFO,Verzoek van 38.96.5.10,scheme=https,pad=/ 2019-01-15 00:11:07,575,root,INFO,| len(headers)=3,len(body)=None 2019-01-15 00:11:07,575,root,INFO,| Onbekende Content-Type: None

Om je te helpen direct met echte gegevens in je app aan de slag te gaan, kun je dit specifieke Postman-verzoek importeren vanuit de projectrepo. Dit simuleert wat je SparkPost-account zal doen, d.w.z. het verzendt een https POST met daarin een e-mail met een specifiek, geldig certificaat (dat behoort tot een testaccount van mij) naar je app.

Je hoeft alleen het doeladres in het verzoek (in het grijze vak hierboven) te wijzigen zodat het overeenkomt met jouw installatie. Als je de tokenwaarde in webapp.ini hebt gewijzigd, pas dan de hoofdervalue in Postman aan om overeen te komen.

Als je app werkt, zie je een "200 OK" reactie terug in Postman. Je host webapp.log-bestand zal uitvoer bevatten zoals deze:

2019-01-15 00:11:48,554,root,INFO,Verzoek van 38.96.5.10,scheme=https,pad=/ 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,| van=bob.lumreeker@gmail.com,DKIM geslaagd 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,| Certificaat: 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,| Certificaat: 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,| geschreven bestand ./bob.lumreeker@gmail.com.crt,bytes=1870,ok=True

Voor een snelle controle, kijk naar de laatste regel – als er "geschreven bestand" staat, dan zit je goed. De rest van dit is het tonen van het DKIM-controle- en certificaatvalidatieproces.

3. SparkPost inbound relay webhooks instellen

Ten eerste kiezen we een domein dat we willen gebruiken als ons inkomend berichtadres – hier zal dat inbound.thetucks.com zijn. Stel je domein in volgens deze gids. Hier zijn de stappen die ik in detail heb gebruikt:

3.1 Voeg MX Records toe

Je hebt toegang nodig tot je specifieke account van de Internet Service Provider. Wanneer klaar, kun je ze controleren met dig – hier is het commando voor mijn domein.

dig +short MX inbound.thetucks.com

Je zou moeten zien:

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

3.2 Creëer een Inkomend Domein

Gebruik de SparkPost Postman API collectie en selecteer de Inkomende Domeinen / Create .. call. De body van de POST-aanvraag bevat je domein, bijvoorbeeld:

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

Postman desktop application with an open tab displaying a 'Create an Inbound Domain' API request, featuring fields such as domain input, several header options, and a JSON payload, aimed at testing and automating API workflows.


3.3 Creëer een Relay Webhook

Creëer een inkomende relay webhook met behulp van de relevante Postman call. De berichtbody in mijn geval bevat:

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

Zoals eerder vermeld, raad ik aan een auth_token in te stellen met je eigen geheime waarde, zoals ingesteld in het webapp.ini-bestand op je host.

Je “target” waarde moet overeenkomen met je hostadres en TCP-poort waar je de webapp host.

Je “domein” waarde moet overeenkomen met je MX records ingesteld in stap 1.

Postman interface, showing the process of creating a relay webhook with detailed JSON configuration, with sections including request method, parameters, and code snippet.


Dat is het! De basisinfrastructuur is gereed. Je zou nu in staat moeten zijn om certificaten naar je inkomend adres te sturen, ze zullen worden verwerkt en verschijnen op je webapplicatiehost – in dit geval een bestand genaamd bob.lumreeker@gmail.com.crt.

Nu kun je versleutelde e-mails naar Bob sturen, met behulp van de tools die beschreven zijn in deel 2 & 3 van deze serie.

Je kunt de inhoud van een certificaat bekijken met behulp van:

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

4. Internals: DKIM-controle, certificaatvalidatie

De app controleert of ontvangen e-mails geldige DKIM hebben en controleert of de certificaten zelf geldig zijn, zoals hier beschreven. Er zijn daar ook implementatieopmerkingen en ideeën voor verder werk.

Samenvattend…

We hebben gezien hoe openbare sleutels van ontvangers eenvoudig kunnen worden verzameld met een e-mail naar een inkomend relay-webhookadres. Zodra dit is gedaan, kunnen die ontvangers hun berichten in S/MIME versleutelde vorm ontvangen.

Dat is het voor nu! Vrolijk verzenden.

Laten we je in contact brengen met een Bird-expert.
Bekijk de volledige kracht van de Bird in 30 minuten.

Door te verzenden, ga je ermee akkoord dat Bird contact met je mag opnemen over onze producten en diensten.

U kunt zich op elk moment afmelden. Zie Bird's Privacyverklaring voor details over gegevensverwerking.

Nieuwsbrief

Blijf op de hoogte met Bird via wekelijkse updates in je inbox.

Laten we je in contact brengen met een Bird-expert.
Bekijk de volledige kracht van de Bird in 30 minuten.

Door te verzenden, ga je ermee akkoord dat Bird contact met je mag opnemen over onze producten en diensten.

U kunt zich op elk moment afmelden. Zie Bird's Privacyverklaring voor details over gegevensverwerking.

Nieuwsbrief

Blijf op de hoogte met Bird via wekelijkse updates in je inbox.

Laten we je in contact brengen met een Bird-expert.
Bekijk de volledige kracht van de Bird in 30 minuten.

Door te verzenden, ga je ermee akkoord dat Bird contact met je mag opnemen over onze producten en diensten.

U kunt zich op elk moment afmelden. Zie Bird's Privacyverklaring voor details over gegevensverwerking.

R

Bereik

G

Grow

M

Manage

A

Automate

Nieuwsbrief

Blijf op de hoogte met Bird via wekelijkse updates in je inbox.