Béid Verbindungsmodi droen déiselwecht Noriicht op déiselwecht Relaykont, an den Ënnerscheed ass wou TLS ufänkt, net wat geschéckt gëtt. Dee eenen opent am Kloertext a gëtt bannent der Verbindung eropgesat; deen aneren ass vum éischte Byte un verschlësselt. Deen eenzegen Ënnerscheed entscheet, wat eng strikt Relaypolitik akzeptéiert, wat een Zwëscheschalt kënne gesinn, a wéi eng Fehlernoriicht Dir en Nomëtteg laang liest. Hei ass wéi ech tëschent hinnen auswielen, wann eng Applikatioun an engem privaten Netz eng Noriicht un eng intern Soumissiounsservice iwwergëtt.

Wou déi zwee Modi sech tatsächlech trennen

D'Aufgab ass a béide Fäll déiselwecht: sech als geneemten Kont authentifizéieren, en erlaabte Sender nennen, d'Empfänger oplëschten an drop waarden, datt de Relay d'Verantwortung iwwerhëlt. Wat sech ännert ass d'Reiefolleg vun den Operatiounen. De Port 587 fänkt als SMTP-Sessioun am Kloertext un, annoncéiert STARTTLS an der EHLO-Antwert a gëtt nëmmen eropgesat wann de Client et freet. De Port 465 erwaart en TLS-Handshake éier iergendeng SMTP-Kommando ausgeschwat gëtt.

Soumissioun a Relay sinn ënnerschiddlech Aarbechten, dofir sinn d'Portnummeren keng austauschbar Gewunnechten. RFC 6409 beschreift d'Noriichtesoumissioun als eng eege Service, an RFC 8314 deckt d'implizit-TLS-Variant of, déi déi meeschten moderne Relays op 465 ubidden. Wann Äre Relay eng vun den zwee dokumentéiert, geet déi Dokumentatioun virun all Préferenz, déi Dir vun engem fréieren Employeur matbruecht hutt.

Wat STARTTLS op 587 Iech gëtt

D'Eropsetzung geschitt bannent der SMTP-Konversatioun, sou datt de Relay se annoncéiere kann an de Client sech ka weigeren ouni se weiderzefueren. An Python werft starttls() eng Ausnam wann de Server d'Erweiderung net ubitt, wat en Downgrade-Versuch an e siichtbare Fehler ëmwandelt amplaz an eng roueg Kloertext-Anmeldung. Dat Verhalen ass d'Haaptargument fir de Modus, an et ass derwäert sech bewosst drop ze verloossen an net zoufälleg.

D'Expositiounsfenster ass kleng awer real: den initialen EHLO-Austausch ass liesbar, an näischt virun der Eropsetzung dréit Umeldungsdaten. Op engem private Wee tëschent engem Applikatiounssubnet an engem internen Relay ass dat Fenster meeschtens akzeptabel. Op engem Wee, deen Dir net kontrolléiert, ass dat de Grond firwat een Teamer op deem anere Modus insistéieren.

En Apparat fir d'Ofhéieren, deen d'STARTTLS-Fähegkeet ewechhëlt, produzéiert eng feelgeschloe Soumissioun, keen Zréckfall. Dat ass d'Resultat dat Dir wëllt, an et ass och de séierste Wee fir erauszefannen, datt eppes SMTP op dem Wee ëmschreift.

Wat impliziten TLS op 465 ännert

Et gëtt guer keng Kloertextphas. De Client mécht en TLS-Handshake soubal de Socket opgeet, validéiert d'Zertifikat géint säin Truststore a tauscht eréischt duerno EHLO, AUTH an d'Noriicht aus. Naischt kann d'Sessioun downgraden well et kee Kloertextzoustand gëtt fir ze verhandelen, an dat eliminéiert eng ganz Klass vu Fehler beim Ofhéieren.

Den Handel ass Diagnostizéierbarkeet. En Relay deen op 465 mat Kloertext-SMTP äntwert, oder en Laaschtverdeeler deen TLS mam falschen Zertifikatsnumm fäerdeg mécht, feelt um Handshake a gëtt Iech en SSL-Fehler amplaz engem Mail-Fehler. Wann dat geschitt, läit de Problem ënner der Applikatioun, an nach sou vill Noriichtsopbau reparéiert en net.

Eng Soumissiounsfunktioun, zwee Transporten

De Code ënnerscheet sech bal net tëschent de Modien, dofir sollt d'Wiel aus der Relaypolitik gemaach ginn an net aus der Bequemlechkeet vun der Bibliothéik. Exportéiert als éischt d'Astellungen an da lauscht en eenzege Skript deen den Transport vum konfiguréierte Port auswielt.

export SMTP_HOST=smtp.relay.internal
export SMTP_PORT=587
export SMTP_USER=svc-notify
export [email protected]
export [email protected]
export SMTP_PASSWORD="$(cat /run/secrets/smtp_password)"
import os, smtplib, ssl
from email.message import EmailMessage

ctx = ssl.create_default_context()
msg = EmailMessage()
msg["From"] = os.environ["MAIL_FROM"]
msg["To"] = os.environ["MAIL_TEST_TO"]
msg["Subject"] = "relay submission test"
msg.set_content("One authorized test message from the app.")

host = os.environ["SMTP_HOST"]
port = int(os.environ.get("SMTP_PORT", "587"))

if port == 465:
    client = smtplib.SMTP_SSL(host, port, context=ctx, timeout=15)
else:
    client = smtplib.SMTP(host, port, timeout=15)
    client.ehlo()
    client.starttls(context=ctx)
    client.ehlo()

with client:
    client.login(os.environ["SMTP_USER"], os.environ["SMTP_PASSWORD"])
    refused = client.send_message(msg)

print("refused:", refused)

create_default_context() iwwerpréift d'Kette an den Hostnumm, dofir muss eng privat CA an den Truststore installéiert ginn amplaz se mat engem net iwwerpréiften Kontext ze ëmgoen. send_message() gëtt en Dictionnaire vun den Empfänger zréck, déi de Relay ofgeleent huet; en eidelen Dictionnaire bedeit datt en se all akzeptéiert huet. Den Timeout vu fofzéng Sekonnen ass en Ausgangspunkt, keen op Äert Netz agestallte Wäert.

Halt d'Passwuert aus dem Image an aus de Loggen. E Geheimnis dat zur Laufzäit montéiert an an d'Ëmwelt gelies gëtt ass gutt; d'Ëmwelt an eng Logzeil ze echoen ass et net, an en Debug-Trace vum AUTH-Austausch och net.

Wielt no Relaypolitik a Wee, net no Gewunnecht

Dräi Bedéngungen entscheeden et. Éischtens, wat de Relay tatsächlech annoncéiert: eng Service déi nëmmen op 587 mam STARTTLS lauschtert, ass op 465 net erreechbar, egal wéi gär Dir impliziten TLS wëllt. Zweetens, ob de Wee tëschent Applikatioun a Relay vertrauenswürdeg genuch ass fir en liesbaren EHLO-Austausch ze akzeptéieren. Drëttens, ob eppes an der Mëtt SMTP ëmschreift oder proxyéiert, well dat entscheet ob de Downgrade-Risiko theoretesch oder lieweg ass.

Wann de Relay béides ubitt, huelen ech 465 fir eng Service déi ouni Iwwerwaachung leeft a 587 fir eng wou eng Persoun déi éischt Inbetribnam gëtt, just well d'Fehlernoriichten op ënnerschiddlech Schichten hiweisen. Déi Préferenz ass meng a se ass keng Politik.

Wat Dir och wielt, notéiert de Port, d'Vertrauensmaterial an d'Senderdomain zesumme mat der Inbetribnam. Da schéckt eng autoriséiert Testnoriicht a bestätegt datt de Relay se akzeptéiert huet, an halt d'Soumissiounsresultat an all spéideren Oflewerungsrapport als separat Opzeechnungen. Eng gelungen Iwwergab un de Relay ass d'Enn vun der Verantwortung vun der Applikatioun, net de Beweis datt d'Noriicht en Inbox erreecht huet.

Ähnlech Artikelen