Neu: Die KI-Firewall überwacht die gesamte Plattform und erklärt jeden Vorfall in einfachen Worten. So funktioniert es

paho-mqtt auf einem Labor-Pi 3 scheitert beim TLS-Handshake mit 'certificate is not yet valid'

paho-mqtt auf einem Labor-Pi 3 scheitert beim TLS-Handshake mit 'certificate is not yet valid'

Gelöst 7 5

Von English mit KI übersetzt ·

Student hier, erster Beitrag. Ich baue für ein Laborprojekt einen Bodenfeuchte-Logger: Pi 3, kapazitiver Sensor über einen ADS1115, paho-mqtt 1.6, Senden an Hermetry auf 8883. Im heimischen WLAN funktioniert alles. Im Labor schlägt es jedes Mal fehl:

ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]
certificate verify failed: certificate is not yet valid (_ssl.c:1006)

Das Labornetz blockiert viele Dinge, deshalb habe ich auch versucht, mich über die IP-Adresse des Brokers statt des Hostnamens zu verbinden (ich hatte sie zu Hause aufgelöst und fest eingetragen), und dann ändert sich der Fehler zu einer Abweichung des Hostnamens. Ich habe certifi neu installiert und client.tls_set() mit und ohne den ca_certs-Pfad aufgerufen. Nichts hilft. Ist es die Labor-Firewall, die TLS stört?

♥ 0

Von English mit KI übersetzt ·

Ist 8883 in diesem Netzwerk überhaupt offen? Manche Standorte erlauben ausgehend nur 80 und 443.

♥ 0

Von English mit KI übersetzt ·

Er muss offen sein, der Handshake startet, er scheitert nur am Zertifikat.

♥ 0

Von English mit KI übersetzt ·

Vielleicht brauchen Sie ein Client-Zertifikat für den Broker? Wir mussten auf unseren Linien-PCs eines laden.

Ground loops are my cardio.
♥ 0

Von English mit KI übersetzt ·

Was zeigt date auf dem Pi an, wenn du im Labor bist?

♥ 2

Von English mit KI übersetzt ·

…dort steht März des letzten Jahres. Zu Hause stimmt es.

♥ 0

Von English mit KI übersetzt ·

Dann ist es das. Ein Pi 3 hat keine echte Echtzeituhr. Beim Booten stellt er die Zeit wieder her, die er beim letzten sauberen Herunterfahren gespeichert hat (fake-hwclock), und wartet dann auf NTP. Dein Lab-Netzwerk blockiert NTP (UDP 123), also bleibt die Uhr in der Vergangenheit, und für die TLS-Bibliothek ist das Serverzertifikat noch nicht gültig. Das habe ich bei der Inbetriebnahme schon auf der Hälfte der Feld-Pis hinter abgeschotteten Firewalls gesehen.Lösungen, wähle eine:

# 1. die interne NTP-Adresse bei der IT erfragen und verwenden
sudo nano /etc/systemd/timesyncd.conf
  [Time]
  NTP=ntp.your-lab.example
sudo systemctl restart systemd-timesyncd
timedatectl   # "System clock synchronized: yes"

# 2. falls nur 443 offen ist: Synchronisation über HTTPS-Header
sudo apt install htpdate
sudo htpdate -s https://www.example.org

Die fest eingetragene IP entfernen. Der Broker benötigt SNI, also über den Hostnamen verbinden; das Zertifikat wird ohnehin gegen diesen Namen geprüft, deshalb kam die Abweichung zustande. Einfaches client.tls_set() mit dem System-CA-Bundle reicht aus; Tyler, für Token-Logins wird kein Client-Zertifikat benötigt, der Server fordert eines an, verlangt es aber nicht.Außerdem sollte das Skript vor dem Verbinden auf eine synchronisierte Uhr warten, sonst bricht ein Neustart im Lab die Verbindung erneut ab. Eine kurze Schleife über timedatectl show -p NTPSynchronized funktioniert. Siehe den TLS-Abschnitt von MQTT.

If it isn't logged, it didn't happen.
Akzeptierte Lösung♥ 5

Von English mit KI übersetzt ·

Die IT hat mir den internen NTP-Server gegeben, die Uhr stimmt, der Hostname ist wieder eingetragen, beim ersten Versuch hat es sich verbunden. Außerdem habe ich die Warteschleife für die Synchronisation in die systemd-Unit eingefügt. Kaum zu glauben, dass es am Datum lag.

♥ 0
Ansicht von 8 Beiträgen – 1 bis 8 (von insgesamt 8)
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.

Mitdiskutieren

Melde dich an, um Fragen zu stellen und zu beantworten, hilfreiche Beiträge mit „Gefällt mir“ zu markieren und die Antwort zu kennzeichnen, die dein Problem gelöst hat. Jeder Beitrag bringt Punkte und Stufen.

Teilen