Forum: Mikrocontroller und Digitale Elektronik Mail schicken mit SMTP und TLS - Anleitung gesucht


von Fritz G. (fritz65)


Lesenswert?

Ich würde gerne mit einem ESP32 Statusmeldungen per Mail verschicken. 
Das sollte über einen Freemai-Server wie gmail geschehen (ca. 1 mail pro 
Tag). Vor Jahrzehnten hatte ich mal einen Mail-client auf einer 
Unix-Workstation programmiert, das ging damals sehr einfach über SMTP. 
Nun nutzen modernere Server aus verständlichen Gründen Verschlüsselung 
und Authentifizierung. Gibt es dafür eine Anleitung bzw. ein Tutorial, 
wie der typische Protokollablauf hier ist. Mit Kryptographie kenne ich 
mich nur theoretisch aus, die praktische Umsetzung ist mir doch recht 
fremd. Der ESP32 kann in Prinzip TLS, allerdings wird mir u.a. nicht 
klar, wie man das Zertifikat des Servers prüft. Braucht der Client auch 
ein Zertifikat, wenn ja, wo bekommt er das her?

NB: Ich nutze das IDF-Framework, nicht Arduino.
von Bert 0. (maschinist)


Lesenswert?

Plain SMTP/25 unterstützt tatsächlich kaum noch ein öffentlicher 
Mailserver.

Die Übergangskrücke STARTTLS (TCP zu SMTP/25, dann mit STARTTLS 
Verschlüsselung aktivieren) ist auch aus der Mode, da anfällig (als MITM 
filtere ich den STARTTLS-Dialog heraus, schwupps, biste plain).

Der übliche Weg heute: Connect zu TCP/465, dann clientseitig TLS-Wrapper 
auf diese Verbindung, Handshake, Zertifikatprüfung (wie bei HTTPS) und 
darüber dann das übliche SMTP-Protokoll.

Für ESP32 gibt es von EspressIf
https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/protocols/esp_tls.html
eine schöne Dokumentation.

Server-Verifizierung kann entweder gegenüber einem "global_ca_store" 
erfolgen, wenn der betreffende Server das unterstützt, ansonsten gibt 
man ein passendes Zertifikatbündel selbst mit, der Ziel-Mailserver wird 
sich ja nicht so häufig ändern. Ggf nutzt man noch SNI, um 
festzustellen, daß Server und Zertifikat zusammengehören.


Gruß... Bert
: Bearbeitet durch User
von Richard (user1234567890)


Lesenswert?

von Fred F. (fred08151)


Lesenswert?

Soweit ich weiss, kann der ESP32 kein TLS.
von Εrnst B. (ernst)


Lesenswert?

Fritz G. schrieb:
> über einen Freemail-Server wie gmail geschehen

GMail will für SMTP gerne einen OAuth2-Login.

https://developers.google.com/workspace/gmail/imap/xoauth2-protocol?hl=de#smtp_protocol_exchange

Bei Google kannst du ein "App-Passwort" für deinen Mailsender-ESP 
erstellen lassen, das funktioniert dann ganz klassisch ohne OAuth.

https://myaccount.google.com/apppasswords

Fred F. schrieb:
> Soweit ich weiss, kann der ESP32 kein TLS.

Doch, sogar am ESP8266 ging das schon, mit ein paar Einschränkungen 
bzgl. verfügbarer Algorithmen, aber TLS_RSA_WITH_AES_256_CBC_SHA ging 
und wurde meist akzeptiert.
von Harald K. (kirnbichler)


Lesenswert?

Fred F. schrieb:
> Soweit ich weiss, kann der ESP32 kein TLS.

Man kann keine Software auf dem ESP32 laufen lassen? Interessant.

Angeblich soll das hier sowas können:

https://saludpcb.com/esp32-smtp-gmail/

Ich schreibe bewusst "angeblich", weil das Internet mit "KI"-generierten 
Halluzinationen geflutet wird und ich diesen Code nicht getestet habe.

Auf den ersten Blick jedenfalls gibt das vor, smtp via tls zu nutzen.
von Stefan R. (stefan_r_bs)


Lesenswert?

Eine Komplettlösung scheint diese Mail-Bibliothek hier zu sein:
https://github.com/mobizt/ReadyMail
(keine persönliche Erfahrung mit EPS32 und dieser Bibliothek - nur 
gesehen, dass das Projekt der Nachfolger dieses Projekts ist, 
https://github.com/mobizt/ESP32-Mail-Client, also immerhin schon einige 
Jahre besteht.)

Fritz G. schrieb:
> Braucht der Client auch
> ein Zertifikat, wenn ja, wo bekommt er das her?

Der Client selbst braucht kein Zertifikat, er will nur das vom 
SMTP-Server vorzeigte Zertifikat prüfen, bevor er eine verschlüsselte 
Verbindung mit diesem startet und ihm dann (im Klartext!) das 
Mailpasswort verrät.
Für die Prüfung braucht er einen Zertifikatspeicher, in dem die 
Zertifikate der ausstellenden Stellen vorgehalten werden (und der muss 
aktualisierbar sein, wenn dieses Zertifikat nach Jahren mal ablaufen).

Der Client kann sich natürlich entscheiden, dass ihm Zertifikate egal 
sind (schneller, leichter - der "Weg zur dunklen Seite") - dann hat er 
ebenfalls eine verschlüsselte Verbindung, kann aber nicht sicher sein, 
mit wem er verbunden ist (wie gesagt: demjenigen wird das Mailpasswort 
bekannt - muss man sich überlegen).
: Bearbeitet durch User
von Hmmm (hmmm)


Lesenswert?

Bert 0. schrieb:
> Die Übergangskrücke STARTTLS (TCP zu SMTP/25, dann mit STARTTLS
> Verschlüsselung aktivieren) ist auch aus der Mode, da anfällig (als MITM
> filtere ich den STARTTLS-Dialog heraus, schwupps, biste plain).

Blödsinn. Das wäre keine Schwäche von STARTTLS, sondern ein 
verkonfigurierter Client, der sich das gefallen lässt ("use STARTTLS if 
possible").

Ein MUA nimmt dafür auch üblicherweise nicht mehr Port 25, sondern 587.

Bert 0. schrieb:
> Ggf nutzt man noch SNI, um festzustellen, daß Server und Zertifikat
> zusammengehören.

Ob der Hostname, zu dem man sich verbinden will, auch im CN steht, muss 
immer geprüft werden, ansonsten bräuchte ein Angreifer nur ein 
beliebiges Zertifikat einer CA, der der Client vertraut.

SNI ist eine ganz andere Baustelle, damit sagt man dem Server (der evtl. 
mehrere FQDNs nutzt), welches Zertifikat er ausliefern soll. Nicht 
zwingend notwendig, aber empfehlenswert, weil aktuelle Mail-Clients es 
auch tun.
von Bert 0. (maschinist)


Lesenswert?

Hmmm schrieb:

> Blödsinn.

Oh, vorzeitiges ETX empfangen.


Bert
Beitrag #8058980 wurde vom Autor gelöscht.
von Gerd E. (robberknight)


Lesenswert?

Ein Punkt sollte auch noch bedacht sein:

Der Client braucht eine aktuelle Uhrzeit, also z.B. per NTP. Ansonsten 
kann der Gültigkeitszeitraum der Zertifikate nicht geprüft werden und 
die Verbindung schlägt dann fehl.

Vor allem direkt nach einem Reboot ist das entscheidend, denn wenn keine 
batteriegepuffterte RTC vorhanden und man richtiges NTP macht (also echt 
synchronisiert und nicht nur einmalig schnell die Zeit holt) dauert es 
ein paar Minuten bis die Uhrzeit synchronisiert ist.

Ich hab schon oft genug Geräte gesehen bei denen das falsch 
implementiert ist.

Datum und Uhrzeit sind im Zusammenhang mit Email sowieso wichtig, 
unabhängig vom Zertifikat. Denn der Email-Client muss beim Versand ja 
den Date:-Header setzen. Und die Zeit da drin sollte einigermaßen 
stimmen. Ansonsten ist es z.B. nicht unwahrscheinlich dass die Email 
beim Empfänger im Spamordner landet. Auch sortieren erfahrungsgemäß 
viele Nutzer ihre Emails nach der Absender-Zeit aus dem Date:-Header, 
auch wenn natürlich eigentlich der Empfangszeitpunkt meist das bessere 
Kriterium wäre.
: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Gerd E. schrieb:
> Vor allem direkt nach einem Reboot ist das entscheidend, denn wenn keine
> batteriegepuffterte RTC vorhanden und man richtiges NTP macht (also echt
> synchronisiert und nicht nur einmalig schnell die Zeit holt) dauert es
> ein paar Minuten bis die Uhrzeit synchronisiert ist.

Weshalb man ja normalerweise initial erstmal die Zeit hart von einem 
Server setzt und danach erst das NTP synchronisieren lässt.

Wenn der Client aber gar keine halbwegs realistische Idee von der 
aktuellen Uhrzeit hat, dann muss man sehen, dass auch das harte Setzen 
der Zeit wirklich passiert und nicht etwa wegen zu großer Diskrepanz 
abgelehnt wird.
von Bauform B. (bauformb)


Lesenswert?

Mit einem gemieteten Webserver kannst du kurze Statusmeldungen als 
GET-Request versenden. Ein Script auf dem Webserver kann daraus eine 
Mail machen. Das geht hier auch per HTTP ohne Zertifikate über Port 443. 
Es kommt natürlich 400 Bad Request zurück, aber der Request erscheint im 
Logfile...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.