Page 1 of 1

RevPi Core 3: Python, Werte in Cloud schreiben

Posted: 22 Oct 2018, 11:33
by TimSt
Hallo,

ich habe in Python ein kleines Programm geschrieben, durch dass
ein RevPi Core 3 Werte per MQTT an die Cloud eines Drittanbieters senden soll.
Damit die Autentifizierung an der Cloud funktioniert, sind zusätzlich
zu dem Programm auch Zertifikat-Dateien notwendig.

Das Programm wurde auf einem Windows 10 Rechner erfolgreich ausgeführt
(Werte sind in der Cloud angekommen).

Auf dem RevPi Core 3 funktioniert das Programm nicht, obwohl eine
Internetverbindung besteht, die Zertifikatdateien vorhanden sind und
das Packet paho-mqtt installiert ist.

Auf dem RevPi Core erhalte ich folgende Fehlermeldung, wenn ich dass
Programm im Python IDLE 3.4.2 ausfuehre:

>>>
Traceback (most recent call last):
File "/home/pi/Test/test.py", line 117, in <module>
client.connect(broker, broker_port, 60)
File "/usr/local/lib/python3.4/dist-packages/paho/mqtt/client.py", line 839, in connect
return self.reconnect()
File "/usr/local/lib/python3.4/dist-packages/paho/mqtt/client.py", line 994, in reconnect
sock.do_handshake()
File "/usr/lib/python3.4/ssl.py", line 804, in do_handshake
self._sslobj.do_handshake()
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:600)

Code: Select all

[code]
[/code]
>>>

Wenn ich das Programm auf dem RevPi Core3 mit Python IDLE 2.7.9 ausführe, gibt es die selbe Fehlermeldung
wie oben, bis auf das die Pfade natürlich auf 2.7 verweisen und _ssl.c:581 anstatt 600 ist.

Ich habe zunächst als Ursache die Pythonversionen im Verdacht gehabt, weil auf dem Windows PC
Python IDLE 3.6.5 und Eclipse mit Python 3.6.5 installiert sind.
Ein Test mit Python 3.4.2 auf dem Windows PC führt zu dem selben Fehler wie RevPi Core 3 mit
Python 3.4.2.
Mittlerweile schließe ich aber die unterschiedlichen Pythonversionen als Ursache aus, weil:
1. Das Script funktioniert auf einem virtuellen Suse Linux mit Python 2.7.15 und 3.6.5
2. Das Script funktioniert auf einem Raspberry Pi mit Python 3.5.3.

Auffällig ist noch folgendes: Mit den Browers des Windows PC (Mozilla) und des
Raspberry Pi (Chromium 60...) öffnet sich die entsprechende Internetnetseite
des Cloud Drittanbieters, wenn die URL, die sich in der Variabel "broker" befindet,
in die Adresszeile des Browsers mit https:// eingeben wird.
Auf dem RevPi Core 3 (Webbrowers Web 3.8.2) wird die Internetseite nicht geöffnet,
sondern nur in der URL-Zeile das Logo des Drittanbieters angezeigt. Es gibt keine
Fehlermeldung; der Inhalt des Webbrowser bleibt einfach leer.

Das Python Programm möchte ich hier nicht posten, da es die URL des Drittanbieters
beinhaltet und das Programm ohne die Zertifikat-Dateien nicht getest werden kann.

Was könnte die Ursache sein, dass das Programm auf dem RevPi Core 3 mit
dem obigen Fehler abbricht?

Re: RevPi Core 3: Python, Werte in Cloud schreiben

Posted: 22 Oct 2018, 14:34
by RevPiModIO
Versuche mal bei dem Paho Client die Zertifikatkontrolle zu deaktivieren - und prüfe, ob du wirklich den richtigen Port für TLS vom Broker benutzt.

Code: Select all

from paho.mqtt.client import Client
from ssl import CERT_NONE

# quelltext

mqtt = Client()
# ....
mqtt.tls_set(cert_reqs=CERT_NONE)
mqtt.tls_insecure_set(True)
# ....

# Und dann das connect auf auf den richtigen Port (8883, nicht 1883), aber das müsste ja schon bei dir sein???

# quelltext
Gruß, Sven

Re: RevPi Core 3: Python, Werte in Cloud schreiben

Posted: 23 Oct 2018, 08:57
by TimSt
Hallo miprotek,
danke für deine beiden Hinweise. Der Port war in dem Programm schon immer 8883. Wieso sollte ein Deaktivierung der Zertifikatskontrolle
in dem Programm das Problem lösen? Die Cloud erwartet doch die Zertifikate. Und wie steht dieser Lösungsvorschlag in Zusammenhang
mit der Tatsache, dass das Problem nur auf dem RevPi Core 3 auftritt?

Re: RevPi Core 3: Python, Werte in Cloud schreiben

Posted: 23 Oct 2018, 16:49
by dirk
Vielen Dank für die ausführliche Fehlerbeschreibung. Ich verstehe dass du die Codes und Details hier nicht posten möchtest. Offensichtlich gibt es eine Abweichung vom Windows 10 zum RevPi System. Der Fehler "ssl.SSLEOFError" ist hier dokumentiert https://docs.python.org/3/library/ssl.html . Er weißt darauf hin, dass die SSL Verbindung unvorhergesehen abgebrochen wurde. Momentan wird die OpenSSL Library hier verwendet. Vergleiche die Ausgaben auf beiden Systemen, ob hier eine Abweichung besteht:

Code: Select all

import ssl
print(ssl.OPENSSL_VERSION)
Bitte erstelle Wireshark Traces von beiden Systemen und vergleiche, wo die Abweichung auftritt.
Könnte es daran liegen, dass die Zertifkat Dateien unter Linux anders interpretiert werden?
Sind beide Geräte im selben Netzwerk oder gibt es hier Abweichungen?

Re: RevPi Core 3: Python, Werte in Cloud schreiben

Posted: 24 Oct 2018, 08:48
by TimSt
Hallo Sven,
ich habe eine Version des Programm mit deaktivierter Zertifikatskontrolle erstellt. Damit funktioniert das Schreiben schreiben in die Cloud sowohl vom Windows PC als auch vom RevPi Core 3 (mit Python 3.4.2 und 2.7.9).
Danke für die Unterstützung. Ich war erstaunt, dass es funktioniert hat, weil der Cloudanbieter die Zertifikate extra zur Verfügung gestellt hat. Für mich läßt das nur den Schluss zu, dass die Cloud nicht korrekt konfiguriert ist,
weil für das Schreiben in die Cloud keine Zertifikate notwendig sind. Oder sehe ich das falsch?

Hallo Dirk,
ich werde deine Hinweise prüfen.