Cyflwyno e-bost Python drwy SMTP: STARTTLS ar 587 neu TLS ar 465?
Mae STARTTLS ar 587 a TLS ymhlyg ar 465 ill dau yn cludo cyflwyniad Python, ond dim ond un sy’n cyd-fynd â’ch relái. Cymharwch yr handshake a’r dulliau methu.
Mae’r ddau fodd cysylltu yn cludo’r un neges i’r un cyfrif relái, a’r gwahaniaeth yw ble mae TLS yn dechrau, nid beth a anfonir. Mae un yn agor mewn testun clir ac yn uwchraddio o fewn y band; mae’r llall wedi’i amgryptio o’r byte cyntaf. Mae’r un gwahaniaeth hwnnw yn penderfynu beth fydd polisi relái llym yn ei dderbyn, beth y gall blwch canol ei arsylwi, a pha neges gwall y byddwch yn treulio prynhawn yn ei darllen. Dyma sut rwy’n dewis rhyngddynt pan fo cymhwysiad ar rwydwaith breifat yn trosglwyddo neges i wasanaeth cyflwyno mewnol.
Ble mae’r ddau fodd yn gwir wahanu
Mae’r dasg yn union yr un fath yn y ddau achos: dilysu fel cyfrif cymeradwy, enwi anfonwr a ganiateir, rhestru derbynwyr, ac aros i’r relái dderbyn cyfrifoldeb. Yr hyn sy’n newid yw trefn y gweithrediadau. Mae porth 587 yn dechrau fel sesiwn SMTP testun clir, yn hysbysebu STARTTLS yn ei ateb EHLO, ac yn uwchraddio dim ond os yw’r cleient yn gofyn. Mae porth 465 yn disgwyl handshake TLS cyn i unrhyw orchymyn SMTP gael ei lefaru.
Mae cyflwyno a relái yn wahanol swyddi, a dyna pam nad yw rhifau porth yn arferion cyfnewidiol. Mae RFC 6409 yn disgrifio cyflwyno negeseuon fel gwasanaeth ar wahân, ac mae RFC 8314 yn cwmpasu’r amrywiolyn TLS ymhlyg y mae’r rhan fwyaf o reláis modern yn ei ddangos ar 465. Os yw’ch relái yn dogfennu un o’r ddau, mae’r ddogfennaeth honno’n drech na’r un ffafriaeth a gawsoch gan gyflogwr blaenorol.
Beth mae STARTTLS ar 587 yn ei roi i chi
Mae’r uwchraddiad yn digwydd o fewn y sgwrs SMTP, felly gall y relái ei hysbysebu a gall y cleient wrthod parhau hebddo. Yn Python, mae starttls() yn codi eithriad pan nad yw’r gweinydd yn cynnig yr estyniad, sy’n troi ymgais i ddiraddio yn fethiant gweladwy yn lle mewngofnodi tawel mewn testun clir. Ymddygiad yw’r prif reswm dros y modd, ac mae’n werth dibynnu arno’n fwriadol yn hytrach nag yn ddamweiniol.
Mae’r ffenestr amlygiad yn fach ond yn real: mae’r cyfnewid EHLO cychwynnol yn ddarllenadwy, ac nid oes unrhyw beth cyn yr uwchraddiad yn cario manylion mewngofnodi. Ar lwybr preifat rhwng is-rwydwaith cymhwysiad a relái mewnol, mae’r ffenestr honno fel arfer yn dderbyniol. Ar lwybr nad ydych yn ei reoli, dyna’r rheswm pam mae rhai timau’n mynnu’r modd arall.
Mae dyfais rhyng-gipio sy’n tynnu’r gallu STARTTLS yn cynhyrchu cyflwyniad wedi methu, nid cwympiad yn ôl. Dyna’r canlyniad rydych ei eisiau, a dyna hefyd y ffordd gyflymaf i ddarganfod bod rhywbeth yn ailysgrifennu SMTP ar y llwybr.
Beth mae TLS ymhlyg ar 465 yn ei newid
Nid oes cam testun clir o gwbl. Mae’r cleient yn gwneud handshake TLS cyn gynted ag y bydd’r soced yn agor, yn dilysu’r dystysgrif yn erbyn ei storfa ymddiriedaeth, a dim ond wedyn yn cyfnewid EHLO, AUTH a’r neges. Ni all unrhyw beth ddiraddio’r sesiwn oherwydd nid oes cyflwr testun clir i drafod ohono, ac mae hynny’n dileu dosbarth cyfan o fethiannau rhyng-gipio.
Y fasnach yw diagnostigrwydd. Mae relái sy’n ateb ar 465 â SMTP testun clir, neu flwch cynilo llwyth sy’n terfynu TLS gyda’r enw tystysgrif anghywir, yn methu ar y handshake ac yn rhoi gwall SSL yn lle gwall post. Pan ddigwydd hynny, mae’r broblem o dan y cymhwysiad, ac ni fydd unrhyw faint o adeiladu neges yn ei thrwsio.
Un swyddogaeth gyflwyno, dau gludydd
Prin y mae’r cod yn wahanol rhwng y moddau, a dyna pam y dylid gwneud y dewis o bolisi’r relái yn hytrach nag o hwylustod y llyfrgell. Allforiwch y gosodiadau yn gyntaf, yna rhedwch un sgript sy’n dewis y cludydd o’r porth cyfluniedig.
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() yn gwirio’r gadwyn a’r enw gwesteiwr, felly rhaid gosod CA preifat yn y storfa ymddiriedaeth yn hytrach na’i osgoi â chyd-destun heb ei wirio. Mae send_message() yn dychwelyd geiriadur o’r derbynwyr a wrthododd y relái; mae geiriadur gwag yn golygu ei fod wedi derbyn pob un. Mae’r terfyn amser o bymtheg eiliad yn fan cychwyn, nid yn werth wedi’i diwnio ar gyfer eich rhwydwaith.
Cadwch y cyfrinair allan o’r ddelwedd ac allan o’r logiau. Mae cyfrinach wedi’i gosod ar amser rhedeg ac wedi’i darllen i’r amgylchedd yn iawn; nid yw adleisio’r amgylchedd i linell log yn iawn, ac nid yw olrhain dadflino’r cyfnewid AUTH ychwaith.
Dewiswch yn ôl polisi’r relái a’r llwybr, nid yn ôl arfer
Mae tair amod yn penderfynu. Yn gyntaf, beth mae’r relái mewn gwirionedd yn ei hysbysebu: ni ellir cyrraedd gwasanaeth sy’n gwrando ar 587 yn unig gyda STARTTLS ar 465, faint bynnag y byddwch yn ffafrio TLS ymhlyg. Yn ail, a yw’r llwybr rhwng y cymhwysiad a’r relái yn ddigon ymddiriedus i dderbyn cyfnewid EHLO darllenadwy. Yn drydydd, a yw rhywbeth yn y canol yn ailysgrifennu neu’n dirprwyo SMTP, oherwydd mae hynny’n penderfynu a yw’r risg o ddiraddio yn ddamcaniaethol neu’n fyw.
Pan fydd y relái yn cynnig y ddau, cymeraf 465 ar gyfer gwasanaeth sy’n rhedeg heb oruchwyliaeth a 587 ar gyfer un lle mae person yn gwylio’r defnydd cyntaf, dim ond oherwydd bod y negeseuon methu yn cyfeirio at haenau gwahanol. Fy ffafriaeth i yw hon ac nid yw’n bolisi.
Beth bynnag a ddewiswch, cofnodwch y porth, y deunydd ymddiriedaeth a’r parth anfonwr ochr yn ochr â’r defnydd. Yna anfonwch un neges brawf awdurdodedig a chadarnhewch fod y relái wedi’i derbyn, gan gadw canlyniad y cyflwyniad ac unrhyw adroddiad danfon diweddarach fel cofnodion ar wahân. Mae trosglwyddiad llwyddiannus i’r relái yn ddiwedd cyfrifoldeb y cymhwysiad, nid yn brawf bod y neges wedi cyrraedd blwch derbyn.