S/MIME Teil 4: Einfaches Sammeln von öffentlichen Schlüsseln des Empfängers - mit SparkPost Inbound Relay Webhooks

S/MIME Teil 4: Einfaches Sammeln von öffentlichen Schlüsseln des Empfängers - mit SparkPost Inbound Relay Webhooks

S/MIME Teil 4: Einfaches Sammeln von öffentlichen Schlüsseln des Empfängers - mit SparkPost Inbound Relay Webhooks

Feb 1, 2019

Herausgegeben von

Herausgegeben von

Bird

Bird

-

Kategorie:

Kategorie:

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

In dieser Serie haben wir gesehen, dass das Einfügen einer S/MIME-Signatur relativ einfach ist. Das Versenden von S/MIME-verschlüsselten E-Mails ist komplizierter, da Sie die öffentlichen Schlüssel der Empfänger erhalten müssen. Es ist eine Sache, wenn Sie einen E-Mail-Client für Menschen wie Thunderbird verwenden - aber wie kann das mit app-generierten E-Mail-Streams funktionieren?


Aber halt - es gibt noch einen anderen Weg nach Mordor, um diese Schlüssel zu bekommen. Ihr Dienst kann Ihre Kunden einladen (natürlich per E-Mail), Ihnen eine signierte E-Mail an eine bekannte Kundendienstadresse zu senden. Mit den magischen Kräften von SparkPost Inbound Relay Webhooks extrahieren und speichern wir diesen öffentlichen Schlüssel für Sie.


Wir können dies in einem einfachen Anwendungsfall zusammenfassen:


  • Als Empfänger von Nachrichten stelle ich Ihrem Dienst meine persönliche E-Mail-Signatur per E-Mail zur Verfügung, damit mir in Zukunft E-Mails in S/MIME-verschlüsselter Form zugesandt werden können.


Daraus lassen sich einige detailliertere Anforderungen ableiten:


  • Wir brauchen einen stets aktiven, zuverlässigen Dienst für eingehende E-Mails, um diese signierten E-Mails zu empfangen.

  • Es sollte keine besonderen Anforderungen an das Mailformat geben, außer dass es eine S/MIME-Signatur tragen sollte.

  • Da jeder versuchen kann, eine E-Mail an diesen Dienst zu senden, sollte er defensiv ausgelegt sein, z. B. um "Spoof"-Nachrichten von bösen Akteuren abzuweisen. Es müssen mehrere Ebenen der Überprüfung vorhanden sein.

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


Es gibt einige nicht-funktionale Anforderungen:


  • Bei Machine-to-Machine-Webhook-Diensten kann es schwierig sein, anhand der Antworten zu erkennen, was im Inneren passiert. Der Dienst sollte umfangreiche, von Menschen lesbare Protokolle auf Anwendungsebene bereitstellen. Insbesondere das Parsen und Prüfen von Zertifikaten sollte protokolliert werden.

  • 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 - fangen wir an!


1. Überblick über die Lösung

So wird die Gesamtlösung aussehen.


2. Installieren, Konfigurieren und Starten der Webanwendung

Wir beginnen mit diesem Teil, damit wir ihn vollständig getestet haben, bevor wir die eingehenden Relay-Webhooks einrichten.


Die 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:


  • Programm readSMIMEsig.py - liest eine E-Mail und analysiert die Zwischen- und Benutzerzertifikate.

  • Programm webapp.py - einfache Flask-kompatible Webanwendung zur Verwendung mit SparkPost Inbound Relay Webhooks.

  • webapp.ini - Konfigurationsdatei für die oben genannten Anwendungen. Eine Konfigurationsdatei ermöglicht es, dieselben Werte sowohl an Befehlszeilen- als auch an Webanwendungen zu übergeben.


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 Gruppe Sicherheit 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/

Sie sollten eine Antwort wie diese erhalten:

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

Das ist eine gute Sache - Ihre Anwendung läuft!


In webapp.log auf Ihrem Host sehen Sie eine ähnliche Ausgabe wie diese:

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: None


To help you play with real data in your app straight away, you can import this specific Postbote Anfrage 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.


Sie müssen lediglich die Zieladresse in der Anfrage (im grauen Feld oben) ändern, damit sie mit Ihrer Installation übereinstimmt. Wenn Sie den Token-Wert in webapp.ini geändert haben, passen Sie den Header-Wert in Postman entsprechend an.


Wenn Ihre Anwendung funktioniert, werden Sie in Postman eine "200 OK"-Antwort sehen. Die Datei webapp.log Ihres Hosts wird eine Ausgabe wie diese enthalten:

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


Achten Sie zur Kontrolle auf die letzte Zeile - wenn dort "written file" steht, ist alles in Ordnung. Der Rest zeigt die DKIM-Prüfung und den Prozess der Zertifikatsvalidierung.


3. Einrichtung von SparkPost-Webhooks für eingehende Relais

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-Einträge hinzufügen

Sie benötigen Zugriff auf das Konto Ihres Internetdienstanbieters. Danach können Sie sie mit dig überprüfen - hier ist der Befehl für meine Domäne.

dig +short MX inbound.thetucks.com

Das sollten Sie sehen:

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


3.2 Erstellen einer Inbound-Domäne

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

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


3.3 Erstellen eines Relay-Webhooks

Erstellen Sie einen eingehenden Relay-Webhook unter Verwendung des entsprechenden Postman-Aufrufs. Der Nachrichtentext enthält in meinem Fall:

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

Ihr "Ziel"-Wert muss mit Ihrer Host-Adresse und dem TCP-Port übereinstimmen, an dem Sie die Webanwendung hosten werden.

Ihr "Domain"-Wert muss mit Ihren in Schritt 1 eingerichteten MX-Einträgen übereinstimmen.



Das war's! Das Klempnerhandwerk ist erledigt. Sie sollten nun in der Lage sein, Zertifikate an Ihre Eingangsadresse zu senden, sie werden verarbeitet und auf Ihrem Webanwendungshost angezeigt - in diesem Fall in einer Datei namens bob.lumreeker@gmail.com.crt.

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

Sie können den Inhalt eines Zertifikats mit überprüfen:

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


4. Interna: DKIM-Prüfung, Zertifikatsvalidierung

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.


Zusammengefasst...

Wir haben gesehen, wie die öffentlichen Schlüssel der Empfänger leicht mit einer E-Mail an eine eingehende Relay-Webhook-Adresse erfasst werden können. Danach können diese Empfänger ihre Nachrichten in S/MIME-verschlüsselter Form erhalten.

Das war's für heute! Viel Spaß beim Versenden.

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

The right message -> zum right person -> am right time.

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

The right message -> zum right person -> am right time.