In Teil 1 hatten wir eine kurze Tour durch S/MIME, wobei wir das Signieren und Verschlüsseln unserer Nachrichtenströme über eine Reihe von E-Mail-Clients betrachteten. Teil 2 führte uns durch ein einfaches Befehlszeilenwerkzeug, um E-Mails zu signieren und zu verschlüsseln, und dann über SparkPost zu senden.
In diesem Teil werden wir betrachten, wie das Werkzeug angepasst werden kann, um Mailströme in lokale Plattformen wie Port25 PowerMTA und Momentum einzuspeisen.
OK – Lass uns anfangen!
1. Erste Schritte
Die Installation des Werkzeugs, das Besorgen deiner Schlüssel usw. ist genau wie zuvor. Wenn du ein lokales E-Mail-System wie PowerMTA oder Momentum verwendest, bist du bereits verantwortlich für die Einrichtung von Versanddomänen, DKIM-Schlüsseln usw. Was wir jetzt tun müssen, ist, eine Möglichkeit zu bieten, die voll-formatierten S/MIME-Nachrichten in deine Server einzuspeisen.
2. SMTP-Einspeisung zu Port25 PowerMTA
PowerMTA unterstützt verschiedene Methoden zur Nachrichten-Einspeisung, einschließlich eines „Pickup“-Verzeichnisses, SMTP und einer API. SMTP ist die hier verwendete Methode.
Um die einfachste mögliche Einrichtung zu veranschaulichen, werden wir die S/MIME-Tools auf demselben Server wie PowerMTA installieren. Wir speisen Nachrichten an den Listener ein, der standardmäßig an TCP-Port 25 offen ist und nur lokalen Verkehr akzeptiert.
export SMTP_HOST=localhost
(Wenn du diesen Schritt vergisst, siehst du: „Umgebungsvariable SMTP_HOST nicht gesetzt – beende“ wenn du versuchst, auszuführen.)
Wir haben den privaten Schlüssel des Absenders (steve@thetucks.com.pem) und den öffentlichen Schlüssel des Empfängers (steve.tuck@sparkpost.com.crt) bereits vorhanden. Die ersten Zeilen der Nachrichtendatei sind:
To: SteveT <steve.tuck@sparkpost.com> From: Steve <steve@thetucks.com> Subject: Dies ist eine Nachricht, die mit HEML erstellt wurde MIME-Version: 1.0 Content-Type: text/html; charset=utf-8 Content-Language: de-DE Content-Transfer-Encoding: 7bit
Wir senden die Nachricht mit:
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
Wir sehen:
Geöffnete SMTP-Verbindung (plain) zu localhost, Port 25, Benutzer="", Passwort="" Senden tests/fancy-HTML-to-smt.eml Von: Steve <steve@thetucks.com> An: SteveT <steve.tuck@sparkpost.com> OK - in 0.028 Sekunden
Die Nachricht kommt schnell im Posteingang an und wird in Mac Mail als signiert und verschlüsselt angezeigt.
Boni-Funktion: DKIM mit PowerMTA
DKIM ist ziemlich einfach einzurichten und koexistiert glücklich mit S/MIME. Die Schritte sind:
Verwende die PowerMTA DKIM Wizard-Website, um den privaten Schlüssel der Versanddomäne (in meinem Fall, mypmta.thetucks.com.pem) und die Inhalte des öffentlichen DNS TXT-Datensatzes zu erstellen.
Richte den DNS TXT-Datensatz mit einem gewählten Selektor ein. Zum Beispiel habe ich den Selektor pmta201811 verwendet. Gültige Selektorkaraktere sind hier definiert.
Lege die mypmta.thetucks.com.pem Datei auf dem Server im Verzeichnis /etc/pmta ab.
Füge Folgendes zu meiner /etc/pmta/config hinzu und starte den PMTA-Dienst neu. (Hier sind diese Direktiven im globalen Bereich geschrieben; in einem Produktionssystem könntest du es vorziehen, sie unter einem virtuellen MTA hinzuzufügen.)
host-name thetucks.com domain-key pmta201811,*,/etc/pmta/mypmta.thetucks.com.pem <domain *> dkim-sign ja </domain>
Der DNS-Datensatz wurde über MX Toolbox erfolgreich überprüft, und DKIM ist jetzt aktiv.
3. SMTP-Einspeisung zu Momentum
Momentum unterstützt verschiedene Methoden zur Nachrichten-Einspeisung, einschließlich API und SMTP. SMTP ist die hier verwendete Methode, zu einem Host, auf dem bereits Momentum läuft. Wir lassen die Konfiguration unverändert, da sie bereits über eine Funktion zur Annahme eingehender Einspeisungen von anderen genehmigten Hosts verfügt.
Dies ist eine kleinere Version einer Produktionsumgebung, in der „Generierungs“-Knoten und MTA-Knoten getrennt, aber eng über ein privates VLAN und Lastenausgleicher verbunden sind, die internen SMTP-Einspeisungsverkehr übernehmen.
Die S/MIME-Tools sind wie zuvor installiert, und wir werden Nachrichten an die Adresse des SMTP-Hosts (MTA) einspeisen:
export SMTP_HOST=xx.xx.xx.xx # setze hier deine eigene MTA / VIP-Adresse
Wie zuvor haben wir den privaten Schlüssel des Absenders (steve@thetucks.com.pem) und den öffentlichen Schlüssel des Empfängers (steve.tuck@sparkpost.com.crt) bereits auf dem „Generierungs“-Knoten vorhanden. Die ersten Zeilen der Nachrichtendatei stimmen mit diesen Adressen überein.
Wir senden die Nachricht vom „Generierungs“-Knoten mit genau demselben Befehl wie zuvor, und die Nachricht erscheint im Posteingang.
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
Wie du erwarten würdest, koexistiert S/MIME auch glücklich mit Momentums DKIM-Signierung.
4. SMTP-Einspeisung zu SparkPost
In Teil 2 verwendeten wir die SparkPost-Übertragungen REST API, um Nachrichten einzuspeisen. Natürlich ist es auch möglich, Nachrichten mit SMTP in SparkPost einzuspeisen. Wir setzen die Umgebungsvariablen wie folgt:
export SMTP_PASSWORD=<<DEIN API-SCHLÜSSEL HIER>> export SMTP_HOST=smtp.sparkpostmail.com export SMTP_USER=SMTP_Injection export SMTP_PORT=587
Wenn du den in der EU gehosteten Service von SparkPost verwendest, dann setze SMTP_HOST auf smtp.eu.sparkpostmail.com.
(Siehe hier für weitere Optionen – zum Beispiel kannst du auf Port 2525 anstelle von 587 einspeisen.)
Die folgende Ausgabe zeigt, dass STARTTLS verwendet wird, zusammen mit dem Benutzernamen und dem Passwort.
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
Du wirst sehen:
Geöffnete SMTP-Verbindung (STARTTLS) zu smtp.sparkpostmail.com, Port 587, Benutzer="SMTP_Injection", Passwort="****************************************" Senden tests/fancy-HTML-to-smt.eml Von: Steve <steve@thetucks.com> An: SteveT <steve.tuck@sparkpost.com> OK - in 0.057 Sekunden
Das Passwort wird mit Platzhaltern ***-Zeichen gedruckt, sodass du die Privatsphäre deines Schlüssels nicht gefährdest, wenn jemand über deine Schulter schaut.
Schutz deiner Anmeldeinformationen
Beachte, dass Umgebungsvariablen in einer Shell-Skriptdatei oder ähnlichem eingerichtet werden könnten, um das erneute Eintippen zu vermeiden. Wenn du das machst, bitte kümmere dich um deine Passwörter/API-Schlüssel, indem du den Zugriff auf diese Datei nur auf dich selbst beschränkst. Wenn beispielsweise deine Anmeldeinformationsdatei my_envs.sh heißt, dann führe aus:
chmod 0700 my_envs.sh
SMTP-bezogene Warnungen, die du sehen könntest
Die SMTP-Einspeisung von SparkPost ist ziemlich streng, wie du es von einem öffentlichen Dienst erwarten würdest. Wenn du die SMTP-Portnummer nicht gesetzt hast, wirst du eine Warnung sehen:
{'bob.lumreeker@gmail.com': (550, b'5.7.1 Weiterleitung verweigert')}
Wenn du den SMTP-Benutzernamen nicht gesetzt hast oder das Passwort nicht gesetzt hast, wirst du sehen:
(530, b'5.7.1 Autorisierung erforderlich. Ref. https://developers.sparkpost.com/api/index#header-smtp-relay-endpoints', 'steve@thetucks.com')
Diese Fehlermeldungen werden einfach so wiedergegeben, wie sie aus der Python SMTP-Bibliothek kommen, daher die Formatierung.
Welches ist schneller – SMTP oder API?
Offen gesagt, ist es unwahrscheinlich, dass S/MIME ein Hochvolumen-Anwendungsfall ist, aber dasselbe Werkzeug mit zwei Ausgabeoptionen zu haben, hat uns einfach darum gebeten, ein Rennen zu veranstalten!
Die „Avocado“-E-Mail-Testdatei, die hier verwendet wird, ist ungefähr 19 KB. Das Wiederholen der Tests 10 Mal über eine Bash-Schleife zeigte, dass die durchschnittlichen Zeiten für SMTP und API ähnlich waren, etwa 60 Millisekunden pro Nachricht, was ziemlich schnell ist. In diesem Fall speisten wir von einer mittleren EC2-Instanz in derselben Hosting-Region wie SparkPost.com ein, was eine gute Möglichkeit ist, die Netzwerkrundlaufzeiten niedrig zu halten.
Wenn wir dasselbe mit einer größeren Testdatei (577 KB) wiederholen, benötigte die API ungefähr 200 Millisekunden, während SMTP 280 Millisekunden pro Nachricht benötigte – immer noch beeindruckend für eine Dateigröße, die 30-mal größer ist. Natürlich kann dein Ergebnis je nach Standort, Internetüberlastung usw. variieren, aber die Leistung dürfte kein Problem sein.
Wenn du wirklich die maximale Leistung benötigst, wäre ein guter Ausgangspunkt, eine set Anzahl an gleichzeitigen Einspeisungsprozessen/Sitzungen gemäß unseren Übertragungsbest Practices Empfehlungen zu starten – z.B. von einer Supervisor-Aufgabe.
Zusammenfassend …
Wir haben gesehen, wie das auf der SparkPost-API basierende Tool, das in Teil 2 verwendet wurde, aktualisiert wurde, um die SMTP-Einspeisung zu unterstützen und On-Premises-MTAs wie Port25 PowerMTA und Momentum in verschiedenen Konfigurationen sowie mit SparkPost zu unterstützen.
Das war's für jetzt! Viel Spaß beim Senden.