
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, maakten we een snelle rondleiding door S/MIME, waarbij we keken naar het ondertekenen en versleutelen van onze berichtstromen over een reeks mailclients. Deel 2 leidde ons door een eenvoudige opdrachtregeltool om e-mails te ondertekenen en versleutelen en deze vervolgens via SparkPost te verzenden. Deel 3 toonde aan hoe je veilige mailstromen kunt injecteren in on-premises platforms zoals Port25 PowerMTA en Momentum.
In deze serie hebben we gezien hoe het opnemen van een S/MIME-handtekening redelijk eenvoudig is. Het verzenden van S/MIME-versleutelde mail is complexer omdat je openbare sleutels van ontvangers moet verkrijgen. Het is één ding als je een mailclient voor mensen gebruikt zoals Thunderbird – maar hoe werkt dat met app-gegenereerde e-mailstromen? App-gegenereerde e-mails, zoals die worden gebruikt door datingplatforms, vereisen een zorgvuldige strategie om betrokkenheid te maximaliseren. Zie hoe dating-apps boeiende getriggerde e-mailexperiences creëren.
Maar wacht – er is een andere manier om die sleutels in Mordor te krijgen. Je dienst kan je klanten uitnodigen (via e-mail, natuurlijk) om je een ondertekende mail terug te sturen naar een bekend klantserviceadres. Door gebruik te maken van de magische krachten van SparkPost Inbound Relay-webhooks, zullen we die openbare sleutel voor jou extraheren en opslaan om te gebruiken.
We kunnen dit samenvatten in een eenvoudig gebruiksscenario:
Als ontvanger van berichten voorzie ik je dienst van mijn persoonlijke e-mailhandtekening via e-mail, zodat in de toekomst e-mails in S/MIME-versleutelde vorm naar mij verzonden kunnen worden.
Hieruit kunnen we enkele meer gedetailleerde vereisten afleiden:
We hebben een altijd-werkende, betrouwbare inkomende e-mailservice nodig om die ondertekende e-mails te ontvangen.
Er mogen geen bijzondere eisen aan het mailformaat zijn, behalve dat het een S/MIME-handtekening moet bevatten.
Aangezien iedereen een mail naar deze dienst kan proberen te sturen, moet deze defensief worden ontworpen, bijvoorbeeld om "spoof"-berichten van slechte actoren af te wijzen. Er moeten verschillende controlelagen zijn.
Als alles in orde lijkt, slaat de dienst het certificaat op in een bestand, gebruikmakend van het bekende plain-text Privacy-Enhanced Mail (PEM)-formaat.
Er zijn enkele niet-functionele vereisten:
Machine-to-machine webhook-diensten kunnen moeilijk te zien zijn alleen vanuit de reacties op wat er intern gebeurt. De dienst moet uitgebreide mensleesbare applicatielogboeken bieden. In het bijzonder moet de parsing en controle van het certificaat worden gelogd.
We voegen testcases toe voor de app-internals, gebruikmakend van het fijne Pytest framework, en voeren die tests automatisch uit bij check-in gebruikmakend van Travis CI integratie met GitHub.
OK – laten we beginnen!
1. Oplossingsoverzicht
Dit is hoe de algehele oplossing eruit zal zien.

2. Installeren, configureren en starten van de web app
3. SparkPost inbound relay webhooks instellen
Eerst selecteren we een domein om te gebruiken als ons inkomende berichtadres – hier zal het inbound.thetucks.com zijn. Stel je domein in volgens deze handleiding. Hier zijn de stappen die ik in detail heb gebruikt:
3.1 Voeg MX-records toe
Je hebt toegang nodig tot je specifieke Internet Service Provider-account. Wanneer dat is gedaan, kun je ze controleren met dig – hier is de opdracht voor mijn domein.
Je zou moeten zien:
3.2 Maak een Inbound Domein
Gebruik de SparkPost Postman API-collectie, waarbij je de Inbound Domains / Create .. oproep selecteert. De body van het POST-verzoek bevat je domein, bijvoorbeeld:

3.3 Maak een Relay Webhook
Maak een inkomende relay webhook met behulp van de relevante Postman-oproep. De berichtinhoud bevat in mijn geval:
Zoals eerder vermeld, raad ik aan om een auth_token in te stellen op 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 webapplicatie host.
Je "domein"-waarde moet overeenkomen met je MX-records ingesteld in stap 1.

Dat is het! De basisinstallatie is klaar. Je zou nu in staat moeten zijn om certificaten naar je inkomende adres te sturen, ze worden verwerkt en verschijnen op je webapplicatie-host – in dit geval, een bestand met de naam bob.lumreeker@gmail.com.crt.
Nu kun je versleutelde e-mails naar Bob sturen, met behulp van de tools die in deel 2 & 3 van deze serie worden beschreven.
Je kunt de inhoud van een certificaat bekijken met:
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.