ESP32 PubSubClient mit WiFiClientSecure auf MQTT2_SERVER mit CERTIFICATE

Begonnen von GunterB, 03 September 2022, 19:45:23

Vorheriges Thema - Nächstes Thema

GunterB

Hallo zusammen,

ich versuche gerade einen entfernten "Arduino" (ESP32) übers Internet mit meinem MQTT2 Server zu verbinden.
Die sicherste Methode scheint mit eben dieser zweite MQTT2 Server zu sein, welchen ich nach außen öffne.

Ich habe auch einen User für allowed. Die Verbindung vom ESP32 funktioniert über den unverschlüsselten Zugang. Da aber jeder den Payload mitlesen kann, möchte ich das verschlüsseln.
Es scheitert einfach am Verbindungsaufbau...

MQTT2_SERVER SSL/HTTPS error:  SSL accept attempt failed error:1408F10B:SSL routines:ssl3_get_record:wrong version number (peer: xxx.xxx.xxx.xxx)
2022.09.03 12:50:51 1: MQTT2_SERVER SSL/HTTPS error:  SSL accept attempt failed error:14094418:SSL routines:ssl3_read_bytes:tlsv1 alert unknown ca (peer: xxx.xxx.xxx.xxx)
2022.09.03 19:18:38 1: MQTT2_SERVER SSL/HTTPS error:  SSL accept attempt failed (peer: xxx.xxx.xxx.xxx)
2022.09.03 19:34:18 1: MQTT2_SERVER SSL/HTTPS error:  SSL accept attempt failed error:14094412:SSL routines:ssl3_read_bytes:sslv3 alert bad certificate (peer: xxx.xxx.xxx.xxx)


Die Zertifikate erstelle ich mit:
openssl req -new -x509 -nodes -out MQTT_CSE-cert.pem -days 3650 -keyout MQTT_CSE-key.pem


Meine Frage, woher nimmt der MQTT2 Server das Zertifikat? Wie gebe ich es an, bzw. wo muss es liegen?

Eigentlich möchte ich die Verbindung nur verschlüsselt haben, ohne Authentifizierung per Zertifikat.
Es sollte also so sein, dass der Server sein Public Key schickt, und alles mit diesem Public Key verschlüsselt wird, ohne dass der Client Kenntnis vom Server Zertifikat haben muss.

rudolfkoenig

ZitatMeine Frage, woher nimmt der MQTT2 Server das Zertifikat?
Aus /opt/FHEM/certs, mit dem Namen server-cert.pem und server-key.pem.
Falls beim Setzen des SSL Attributes kein Zertifikat vorhanden ist, und openssl verfuegbar ist, dann wird ein Selbstsigniertes erzeugt.
Falls man fuer diesen Server ein spezielles Zertifikat verwenden will, dann kann man sslCertPrefix setzen, das wird dann statt certs/server- verwendet. Steht in der Doku.

ZitatEigentlich möchte ich die Verbindung nur verschlüsselt haben, ohne Authentifizierung per Zertifikat.
Das FHEM Framework fuer SSL-Server bietet (noch?) keine Verifikation der Cient-Zertifikate an.

GunterB

Hallo,

vielen Dank für deine Antwort!

Leider finde ich die entsprechende Doku nicht  :-[

rudolfkoenig

ZitatLeider finde ich die entsprechende Doku nicht  :-[
Das ist eine schlechte Ausrede:
- falls die allmaechtigen Suchmaschinen es nicht gefunden haben: https://fhem.de/commandref_modular.html#MQTT2_SERVER-attr-sslCertPrefix
- beim Auswahl eines Attributes wird die entsprechende Passage aus dem commandref angezeigt (siehe Anhang).
- beim Aufruf des FHEM-Frontends gibt es 3 Links (siehe Anhang).
Ich bin nicht der Ansicht, dass wir mehr Hinweise auf Doku brauchen.

Ob die Doku an sich verstaendlich ist, ist eine andere Sache, man kann es vermutlich nicht jedem Recht machen.
Dafuer haben wir drei Alternativen: commandref, wiki und Forum.

GunterB

Ja, sorry. Ich bin schon zwei Jahre dabei, habe 16000 Zeilen FHEM Konfigdatei, lese auch generell bevor ich was mache, aber ich wusste mir nicht mehr zu helfen  :-\

Ich kam nicht auf die Idee das Attribut sslCertPrefix anzuschauen. Klar mein Fehler.

GunterB

#5
Also mittlerweile funktioniert es.
Wichtig ist eben auch, bei der Zertifikatserstellung den Common Name (e.g. server FQDN or YOUR name) richtig festzulegen.


Zertifikat erstellen, und den CN (s.o.) so festlegen, wie er auch nacher beim Connect aufgerufen wird zB 192.168.0.100 oder MeinServer.dyndns.org

cd /opt/fhem
/opt/fhem $ sudo mkdir certs
/opt/fhem $ cd /opt/fhem/certs
sudo openssl req -new -x509 -nodes -out server-cert.pem -days 3650 -keyout server-key.pem
sudo chmod 644 /opt/fhem/certs/server-key.pem
sudo chmod 644 /opt/fhem/certs/server-cert.pem


Das Zertifikat (server-cert.pem) wird dann in den Code kopiert:
ESP32DevelopmentBoardSecure.ino

Und es läuft, auch mit dem PubSubClient.

Dann läuft das NETSGP über SSL über das Internet.

Jetzt müsste ich nur noch schauen, wie ich die sicherste MQTT Server Variante hinbekomme.

Ist es sinnvoll einen Mosquitto über einen Container, nur für die Internetanbindung laufen zu lassen und in FHEM einen MQTT Client einzusetzen?
Oder reicht es schon einen MQTT Proxy vor den MQTT2_SERVER zu setzen?
Momentan habe ich den MQTT2_SERVER:8883 direkt geforwarded und schon ein paar Connects fremder IPs drauf.