In dieser Folge werden wir:
Einige einfache Befehlszeilentools zum Signieren und Verschlüsseln von E-Mails installieren
Ihren Sender-Schlüssel/Zertifikat zum Signieren erhalten
Eine signierte Nachricht über SparkPost senden und die empfangene Nachricht ansehen
Optional: Ihr Empfänger-Zertifikat zur Verschlüsselung erhalten
Eine signierte und verschlüsselte Nachricht über SparkPost senden und die empfangene Nachricht ansehen
Ein praktisches Standalone-Tool „mimeshow“ ausprobieren, um die internen Strukturen von E-Mail-Dateien anzusehen.
OK – lass uns anfangen!
1. Die Tools installieren
Die Demotools befinden sich auf Github hier, einschließlich Installationsanweisungen. Sie werden das „Build-Passing“-Logo bemerken – Travis und pytest überprüfen automatisch den Build-Status. Beachten Sie, dass diese Tools von SparkPost nicht offiziell unterstützt werden, aber ich habe versucht, sie robust und einfach zu bedienen zu machen.
Wenn Sie ein gewisses Wissen über Python und pip haben, sollte die Installation Ihnen recht vertraut vorkommen. Die Pipfile kümmert sich automatisch um die externen Abhängigkeiten für Sie. Sobald es erledigt ist, können Sie überprüfen, ob alles installiert ist, indem Sie
./sparkpostSMIME.py -h
ausführen.
Sie sollten den freundlichen Hilfetext sehen. Als Nächstes müssen wir…
2. Ihren Sender-Schlüssel/Zertifikat zum Signieren erhalten
Wenn Sie bereits eine Schlüsseldatei für Ihre Sendereigenschaft haben, können Sie direkt weitermachen. Andernfalls gibt es hier zwei Optionen zur Auswahl:
a) Selbstsignierter Testschlüssel/Zertifikat (nicht extern gültig)
Wenn Sie nur testen, können Sie „selbstsignierte“ Zertifikate und Schlüssel für eine E-Mail-Adresse mit dem Befehlszeilen-Tool openssl unter Linux erstellen, indem Sie einem Verfahren wie diesem hier folgen. Am Ende dieses Prozesses haben Sie eine smime.p12 Datei. Benennen Sie diese Datei um, um Ihrem Senderidentität zu entsprechen, einschließlich des @-Zeichens, beispielsweise alice@example.com.p12 .
oder
b) Extern gültige Schlüssel/Zertifikate
Wenn Sie extern gültige Schlüssel/Zertifikate erhalten möchten, die es Ihnen ermöglichen, zu signieren, gibt es eine Liste von Anbietern hier. Ich habe festgestellt, dass Comodo gut funktioniert (kostenlos für nicht-kommerzielle Nutzung), und es ist einfacher als das selbstsignierende Verfahren oben. Folgen Sie dem Anmeldeprozess, empfangen Sie Ihre Validierungs-E-Mail und stellen Sie sicher, dass Sie den Link in Firefox öffnen. Gehen Sie zu Firefox Einstellungen / Datenschutz und Sicherheit. Scrollen Sie zu Zertifikate / Zertifikate anzeigen:
Wählen Sie Ihr Zertifikat aus und verwenden Sie die Option „Sichern“, um es als Datei im PKCS12-Format zu speichern (fügen Sie die Dateiendung .p12 zu Ihrem Dateinamen hinzu), die den privaten Schlüssel und die öffentliche Zertifikatskette enthält.
Geben Sie ein Passwort ein, um die .p12-Datei zu sichern:
Erzeugen Sie separate öffentliche (.crt) und private (.pem) Schlüsseldateien
Egal, ob Sie a) oder b) verwendet haben, Sie werden nun eine .p12-Datei für Ihre Senderidentität haben. Das ist ein großer Schritt nach vorne – holen Sie sich jetzt einen Kaffee!
Jetzt müssen wir separate öffentliche und private Schlüsseldateien wie folgt erzeugen – wobei Sie Ihre eigene E-Mail-Adresse für die Beispieladresse verwenden:
openssl pkcs12 -in alice\@example.com.p12 -clcerts -nokeys -out alice\@example.com.crt openssl pkcs12 -in alice\@example.com.p12 -nocerts -nodes -out alice\@example.com.pem
Sie müssen das Passwort eingeben, das Sie zuvor angegeben haben. Beachten Sie, dass diese umgekehrten Schrägstriche \ verwendet werden, um das @-Zeichen zu escapen – sie trennen nicht die Namen eines Verzeichnispfads (das ist ein Schrägstrich / unter Mac OSX und Linux).
Wenn Sie Windows verwenden, sind openssl-Implementierungen verfügbar, wie die MINGW64-Version, die in den Git-Befehlszeilentools integriert ist, aber ich habe festgestellt, dass es dazu neigt, einfach zu hängen. Wahrscheinlich wird es einfacher und schneller sein, dies unter Linux zu tun und dann Ihre Dateien zu kopieren. Dieselben Git-Tools für Windows kommen mit einem schönen ssh-Client, den Sie verwenden können, um sich bei einem Linux-Server anzumelden, wie z.B. einem Amazon EC2-Instanz.
2.1 Eine Nachricht signieren
Es gibt bereits einen Dummy-Schlüssel/Zertifikat und eine E-Mail-Quelldatei im Testverzeichnis für alice@example.com, sodass Sie bereits vor Besitz Ihrer eigenen Schlüssel einige Ausgaben erhalten können. Geben Sie einfach Folgendes ein:
cd tests ../sparkpostSMIME.py example_email1.eml --sign
Und Sie erhalten:
To: Bob <bob@example.com> From: Alice <alice@example.com> Subject: Eine Nachricht MIME-Version: 1.0 Content-Type: application/x-pkcs7-mime; smime-type=signed-data; name="smime.p7m" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7m" MIIKXAYJKoZIhvcNAQcCoIIKTTCCCkkCAQExDzANBglghkgBZQMEAgEFADCCAQoGCSqGSIb3DQEH AaCB/ASB+VRvOiBCb2IgPGJvYkBleGFtcGxlLmNvbT4NCkZyb206IEFsaWNlIDxhbGljZUBleGFt : :
Sie können keine E-Mails von example.com über SparkPost senden, es sei denn, Sie besitzen diese Domain, also ist der nächste Schritt, Ihren eigenen Schlüssel zu verwenden und eine signierte Nachricht von Ihrer eigenen Domain zu senden.
3. Eine signierte Nachricht über SparkPost senden
Lassen Sie uns nun eine echte Sendedomäne verwenden, eingerichtet nach dem SparkPost Neuen Benutzerhandbuch. Wir haben die Senderzertifikat- und Schlüsseldateien im aktuellen Verzeichnis:
steve@thetucks.com.crt steve@thetucks.com.pem
Die Datei tests/declaration.eml ist im Projekt enthalten. Es handelt sich nur um eine Textdatei, sodass Sie die From:-Adresse an Ihre eigene Sendedomäne und die To:-Adresse an Ihren Testempfänger anpassen können. Der Anfang der Datei sieht folgendermaßen aus:
To: Bob <bob.lumreeker@gmail.com> From: Steve <steve@thetucks.com> Subject: Hier ist unsere Erklärung MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-GB Wenn im Verlauf menschlicher Ereignisse es notwendig wird …
Setzen Sie Ihren API-Schlüssel:
export SPARKPOST_API_KEY=<<Setzen Sie hier Ihren API-Schlüssel ein>>
Versenden Sie die E-Mail:
./sparkpostSMIME.py tests/declaration.eml --sign --send_api
Sie werden sehen:
Geöffnete Verbindung zu https://api.sparkpost.com/api/v1 Sending tests/declaration.eml From: Steve <steve@thetucks.com> To: Bob <bob.lumreeker@gmail.com> OK - in 1,15 Sekunden
Einige Sekunden später kommt die E-Mail im Posteingang von Bob an. Thunderbird zeigt sie mit einem roten Punkt auf dem Umschlag an, was auf eine gültige Absenderunterschrift hinweist.
Erfolg! Beenden Sie den Kaffee, den Sie sich verdient haben. Wenn Sie Probleme haben, überprüfen Sie, ob Ihre From:-Adresse in der E-Mail-Datei mit dem Namen Ihrer .crt- und .pem-Dateien übereinstimmt.
4. Nachrichten verschlüsseln
Um eine Nachricht zu verschlüsseln, benötigen Sie den öffentlichen Schlüssel Ihres Empfängers in Zertifikatsform. Dies ist eine Textdatei, die wie folgt aussieht:
Bag Attributes friendlyName: s COMODO CA Limited ID #2 localKeyID: 32 84 AB 9C 56 5C 80 C6 89 4D 40 46 DD D4 7C 71 E8 CD ED C1 subject=/emailAddress=bob.lumreeker@gmail.com issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Client Authentication and Secure Email CA -----BEGIN CERTIFICATE----- sieht hier nach zufälligen Zeichen aus -----END CERTIFICATE-----
Es gibt ein Dummy-Empfängerzertifikat für bob@example.com im Testverzeichnis, damit Sie damit üben können, bevor Sie ein echtes Zertifikat haben:
cd tests ../sparkpostSMIME.py example_email1.eml --sign --encrypt
Sie werden sehen:
To: Bob <bob@example.com> From: Alice <alice@example.com> Subject: Eine Nachricht MIME-Version: 1.0 Content-Type: application/pkcs7-mime; smime-type=enveloped-data; name=smime.p7m Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=smime.p7m MIIRwQYJKoZIhvcNAQcDoIIRsjCCEa4CAQAxggKlMIICoQIBADCBijCBhDELMAkG :
Sie werden feststellen, dass die Ausgabelänge deutlich länger ist als bei einer verschlüsselten Nachricht, da sie viele zusätzliche Informationen sowie die verschlüsselte Nachricht selbst enthält.
4.1 Eine verschlüsselte, signierte Nachricht über SparkPost senden
Lassen Sie uns eine verschlüsselte Nachricht an eine echte E-Mail-Adresse senden. Sie können den gleichen Prozess wie zuvor (selbstsigniert oder einen Anbieter wie Comodo) befolgen, um einen öffentlichen Schlüssel/Zertifikat für Ihre eigenen Empfängeradressen zu erhalten. Sie benötigen nur die .crt-Datei – der Empfänger muss Ihnen niemals seinen privaten Schlüssel (.p12- und .pem-Dateien) geben.
Ich habe die Datei bob.lumreeker@gmail.com.crt für meinen beabsichtigten Empfänger – die mit der From:-Adresse in meiner Datei übereinstimmt.
Hier ist der Befehl, um zu senden:
./sparkpostSMIME.py tests/declaration.eml --sign --encrypt --send_api
Ich sehe:
Geöffnete Verbindung zu https://api.sparkpost.com/api/v1 Sending tests/declaration.eml From: Steve <steve@thetucks.com> To: Bob <bob.lumreeker@gmail.com> OK - in 1,168 Sekunden
Die E-Mail erscheint in Thunderbird mit dem „roten Punkt“-Signatur-Symbol und dem „Schloss“-Verschlüsselungssymbol.
Sie können komplexe HTML-basierte E-Mails mit Links und Bildern genauso einfach senden, wie das Beispiel in Teil 1 zeigt. Einige Clients wie Thunderbird fragen nach Erlaubnis, um externe Links und Bilder innerhalb von verschlüsselten S/MIME-Nachrichten anzuzeigen, aber nur signierte Nachrichten werden gut in Clients wie Thunderbird und Gmail angezeigt:
Beachten Sie, dass das Dropdown „Verifiziertes E-Mail-Adresse“ anzeigt.
Weitere Gedanken & Dinge, die zu beachten sind
Dieses Tool verfolgt einen supersimplen Ansatz zur Beschaffung der notwendigen Schlüssel – es sucht einfach nach benannten Dateien im aktuellen Verzeichnis. Komplexere Arrangements, wie das Halten aller Schlüssel in einer Datenbank, könnten leicht hinzugefügt werden, aber ich wollte, dass der Code so einfach wie möglich ist.
Sie können andere Empfänger mit Cc: und Bcc: angeben, und sie werden zugestellt; dies könnte nützlich für Archivierungszwecke sein. Signierte Nachrichten werden von anderen Empfängern empfangen und können vollständig mit der Unterschrift angezeigt werden. Das Tool entfernt den Bcc:-Header aus der gelieferten Nachricht (wie es ein Desktop-E-Mail-Client tun würde).
Um sicherzustellen, dass Nachrichten unverändert durch SparkPost geleitet werden (was das Signieren brechen könnte), setzt das Tool API-Optionen für „transaktionale“ Postsendungen, wobei Open- und Klick-Tracking deaktiviert sind.
Wenn Sie Verschlüsselung verwenden, denken Sie daran, dass das Tool die einzelne To:-Adresse dafür erfasst. Die anderen Empfänger können den Nachrichtentext nur dekodieren, wenn sie den privaten Schlüssel des zugewiesenen Empfängers haben. Wenn Sie sekundäre Empfänger nur als Nachweis für durchgeführte Zustellungen verwenden, könnte das dennoch in Ordnung sein.
Signiert, versiegelt, geliefert … Ich bin Ihr
Das ist unser kurzer Überblick, wie man S/MIME-Nachrichten über SparkPost signiert, versiegelt und liefert. Schnelle Erinnerung: Das Demoprojekt befindet sich auf Github hier, ich habe versucht, es einfach zu installieren und zu verwenden.
Bonus-Funktion: Anzeige von MIME-Teilen mit „mimeshow“
RFC822 MIME-multipart-Datei-Innenleben sind für Menschen recht komplex zu lesen. Das Projekt beinhaltet ein Standalone-Tool, um dies zu erleichtern, das „mimeshow“ heißt.
Dies nimmt alle Ihre E-Mail-Dateien (nicht nur S/MIME) und zeigt die interne Struktur an. Hier ist ein Beispiel:
./mimeshow.py testcases/img_and_attachment.eml
Sie werden sehen:
To Bob <bob.lumreeker@gmail.com> From Steve <steve@thetucks.com> Subject Testen von Anhängen usw. MIME-Version 1.0 Content-Type multipart/mixed; boundary="------------7D48652042860D0098C65210" Content-Language en-GB Content-Type multipart/alternative; boundary="------------58C0BF87598336550D70EB95" Content-Type text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding 7bit Content-Transfer-Encoding quoted-printable Content-Type text/html; charset="utf-8" Content-Type application/pdf; name="sparkpost-datasheet-tam-technical-account-management.pdf" Content-Transfer-Encoding base64 Content-Disposition attachment; filename="sparkpost-datasheet-tam-technical-account-management.pdf"
Sie können auch als Filter verwenden, um eine menschenlesbare Zusammenfassung von sparkpostSMIME Ausgaben bereitzustellen:
./sparkpostSMIME.py tests/declaration.eml --sign --encrypt | ./mimeshow.py
Sie werden sehen:
To Bob <bob.lumreeker@gmail.com> From Steve <steve@thetucks.com> Subject Hier ist unsere Erklärung Content-Language en-GB MIME-Version 1.0 Content-Type application/pkcs7-mime; smime-type=enveloped-data; name=smime.p7m Content-Transfer-Encoding base64 Content-Disposition attachment; filename=smime.p7m
Schließlich …
Um zusammenzufassen – wir haben einige einfache Befehlszeilentools zum Signieren und Verschlüsseln von E-Mails installiert (das Github-Repo ist hier, einschließlich Installationsanweisungen).
Wir haben unseren Sender-Schlüssel/Zertifikat zum Signieren erhalten und eine signierte Nachricht über SparkPost gesendet. Wir haben ein Empfängerzertifikat zur Verschlüsselung erhalten und dann eine signierte und verschlüsselte Nachricht über SparkPost gesendet.
Zuletzt haben wir das praktische Standalone-Tool „mimeshow“ ausprobiert, um die internen Strukturen von E-Mail-Dateien anzusehen.
Das war's für jetzt! Bis bald!.