CA Zertifikate für ublox-Modem

OP #6748124
Lesenswert?

Moin,
ich habe gerade Anlaufschwierigkeiten beim Umsetzen einer gesicherten 
Verbindung zwischen einem u-blox SARA-R410M-02B LTE-Modem und einem 
Server (Raspberry Pi mit python script).
Derzeit "unterhalten" sich die beiden problemlos über eine ungesicherte 
TCP/IP-Verbindung.

Jetzt würde ich die Verbindung gerne absichern (Authentifizierung und 
Verschlüsselung der Daten).
Also die vorhandenen Programme etsprechend erweitern.

Dazu bietet das Modem die Möglichkeit, root certificate und pre-shared 
keys zu verwenden.
Für python gibt es auch eine SSL-Library...

Ich habe jetzt diverse Anleitungen für das Erstellen von CA Zertigikaten 
gefunden. Leider beziehen sich die sich alle auf HTTPS.
HTTP ist aber gar nicht notwendig, da nur Text übertragen wird.

Wie gehe ich da am Besten vor?

Vielen Dank schon mal.
#6748164
Lesenswert?

HTTPS ist nur SSL + HTTP, d.h. bei den Zertifikaten ändert sich 
praktisch nix für OP.

Man kann also nach Anleitung vorgehen - allerdings nach der Anleitung 
bei eigener CA. HTTPS wird gerne mit fremder CA (wie Lets Encrypt) 
gefahren, die die Identität des Servers unabhängig feststellen soll und 
deren Root Zertifikat im Browser vorinstalliert ist.

Das Szenario von OP ist eher mit VPN vergleichbar, wo es ebenfalls 
Anleitungen zum Aufsetzen von CA und Zertifikaten - z.B. mit easy-RSA - 
gibt.

Falls Python Probleme macht: Stunnel kann auf bestehende TCP/IP 
Infrastuktur SSL draufsatteln.
OP #6748493
Lesenswert?

Diverse Schlüssel und Zertifikate wurden jetzt erzeugt (OpenSSl...).
Leider möchte das Modem das Zertifikat aber nicht übernehmen.

Jim M. schrieb:
> Falls Python Probleme macht: Stunnel kann auf bestehende TCP/IP
> Infrastuktur SSL draufsatteln.

Eigentlich wollte ich dazu die ssl-Lib verwenden. Aber die zickt rum.

Nach dem Beispiel
https://gist.github.com/dergachev/7028596
bzw. dessen Quelle
https://piware.de/2011/01/creating-an-https-server-in-python/

wollte ich auf dem Raspberry Pi einen HTTPS-Server ausprobieren.
Fehlermeldung:
Traceback (most recent call last):
  File "/home/pi/simple-https-server.py", line 5, in <module>
    httpd.socket = ssl.wrap_socket(httpd.socket, 
certfile='./server.pem', server_side=True)
  File "/usr/local/opt/python-3.9.5/lib/python3.9/ssl.py", line 1402, in 
wrap_socket
    context.load_cert_chain(certfile, keyfile)
ssl.SSLError: [SSL] PEM lib (_ssl.c:4044)

Er erkennt also die Zertifikatsdatei nicht richtig?!
Edit:
Der Testserver unter python läuft soweit.
(Man sollte auch mal ganz unten bei den Atworten gucken...)
OP #6748536
Lesenswert?

Hmmm schrieb:
> Rahul D. schrieb:
>> Leider möchte das Modem das Zertifikat aber nicht übernehmen.
>
> Was heisst das genau?

Antwort des Modems:
+CME ERROR: USECMNG import timeout expired (no input for > 20 s)

Eigentlich sollte eine Antwort mit MD5-Checksumme kommen.
Es möchte aber lieber eine Fehlermeldung abgeben ;)

Hmmm schrieb:
> Rahul D. schrieb:
>> Der Testserver unter python läuft soweit.
>
> Zum Testen ist OpenSSL immer sehr hilfreich:
>
> openssl s_client -connect <host>:<port>
>
> Erst wenn damit alles fehlerfrei funktioniert, würde ich die
> Client-Baustelle angehen.

OK. Ich bin ziemlich neu in dem Thema drin (Meine Netzwerk-Kenntnisse 
beschränken sich auf Standardinstallationen von nginx und Apache, sowie 
php im Intranet).
Gast #6748565
Lesenswert?

Rahul D. schrieb:
> Antwort des Modems:
> +CME ERROR: USECMNG import timeout expired (no input for > 20 s)

Evtl. eine falsche Länge übergeben, so dass auf weitere Daten gewartet 
wird?

Am besten erstmal an einen PC hängen und mit einem Terminal 
experimentieren.

Rahul D. schrieb:
> Ich bin ziemlich neu in dem Thema drin

X.509 ist auf den ersten Blick grausam, aber wenn man die Grundlagen 
verstanden hat, ist es bedeutend einfacher.
OP #6749367
Lesenswert?

Hmmm schrieb:
> Evtl. eine falsche Länge übergeben, so dass auf weitere Daten gewartet
> wird?

Jein, wenn man die Zeilenwechsel in der Datei entfernt und dann die 
richtige Stringlänge verwendet, mag das Modem das Zertifikat.

Hmmm schrieb:
> Am besten erstmal an einen PC hängen und mit einem Terminal
> experimentieren.

Sowieso.

Mal sehen, wie sich python jetzt windet...
Gast #6749385
Lesenswert?

Rahul D. schrieb:
> Jein, wenn man die Zeilenwechsel in der Datei entfernt und dann die
> richtige Stringlänge verwendet, mag das Modem das Zertifikat.

Hast Du das Zeilenende jeweils als 2 Bytes (CR/LF, wie unter DOS/Windows 
üblich) gezählt? Beim Pasten ins Terminal wird daraus vermutlich ein 
nacktes CR, eben so, als hätte man es manuell eingetippt.
OP #6749491
Lesenswert?

Hmmm schrieb:
> Rahul D. schrieb:
>> Jein, wenn man die Zeilenwechsel in der Datei entfernt und dann die
>> richtige Stringlänge verwendet, mag das Modem das Zertifikat.
>
> Hast Du das Zeilenende jeweils als 2 Bytes (CR/LF, wie unter DOS/Windows
> üblich) gezählt? Beim Pasten ins Terminal wird daraus vermutlich ein
> nacktes CR, eben so, als hätte man es manuell eingetippt.

Das Zertifikat wurde durch ein Raspberry Pi erstellt und enthielt nur 
<LF> als Zeilenendezeichen.
Das habe ich es auf meinen Windows-Rechner kopiert an dem das Modem per 
USB-RS232-Wandler hängt.
Die <LF> habe ich einfach alle (manuell) entfernt, den restelichen Text 
in die Zwischenablage kopiert und konnte dann mit der richtigen Anzahl 
das Zertifikat aufs Modem kopieren.
Alles gut - das Thema wäre erledigt.

Jetzt geht es darum, python dazu zu bringen, auch mit der TSL-Geschichte 
zurecht zu kommen...
Gast #6749498
Lesenswert?

Rahul D. schrieb:
> Jetzt geht es darum, python dazu zu bringen, auch mit der TSL-Geschichte
> zurecht zu kommen...

Hast Du der Library sowohl das Zertifikat als auch den Key übergeben? 
Benötigt wird immer beides.

Und falls Du den Key bei der Erzeugung mit einer Passphrase gesichert 
hast, muss auch die noch irgendwie übergeben werden.
OP #6750101
Lesenswert?

Moin,
mal eine Rückmeldung, falls sich jemand auch so dämlich wie ich 
anstellt:

Das root certificate  habe ich mit
AT+USECMNG=0,0,"rootCA",1432
importiert (1432 Zeichen nach dem Entfernen der Zeilenumbrüche).

Das Zeritfikat wird dann durch
AT+USECPRF=0,2,0
verwendet.

Dann noch den Socket (nachdem er mit "+USOCR=6" zur Verwendung von TCP 
erzeugt wurde) auf TSL schalten:
AT+USOSEC=0,1,0

Danach kann man die Übertragung ganz "normal" durchführen.

Die notwendigen Dateien habe ich mit
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 
<Tage>

erzeugt (<Tage> durch die gewünschte "Haltbarkeitsdauer" ersetzen).
(Quelle: 
https://stackoverflow.com/questions/10175812/how-to-generate-a-self-signed-ssl-certificate-using-openssl)

Beim Zertifikatsimport ins u-blox-Modem sollte man sich nicht an der 
Dateigröße orientieren, sondern wirklich die (lesbaren) Zeichen zählen, 
da in der Dateigröße auch die Zeilenendezeichen mit gezählt werden.
Ob die das Modem stören weiß ich nicht (nicht getestet, da Workaround 
vorhanden).

Vielen Dank an die Unterstützer!
OP #6756891
Lesenswert?

Rahul D. schrieb:
> Die Keys und Zertifikate erfordern noch eine Passwort-Eingabe.
> Das sollte durch hinzufügen von "-nodes" (für "no DES") vermutlich
> entfallen (Vermutung, da ich gerade mal wieder mit was anderem
> beschäftigt bin; hatte ich aber auch irgendwo gelesen).

Ich verbessere mich mal selbst:
"openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days
<Tage> -nodes"

wodurch die Passwortabfrage entfällt. Ansonsten wie oben geschrieben 
vorgehen.

Jetzt muss ich das "nur noch" einem funktionierenden, aber unsicheren 
monty-python-script beibringen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren