Dienstag, 30. November 2021

selbstsignierte Zertikate

Will man im eigenen Netzwerk HTTPS/SSL fehlerfrei verwenden, braucht man ein Zertikat was von den Endgeräten akzeptiert wird. Das Ergebnis meiner Experimente mit FHEM habe ich hier mal aufgeschrieben.

Es gibt zwei Ansätze in FHEM:

  1. Im FHEMWEB Device einfach attr <name> HTTPS 1 setzen
  2. FHEM Wiki SSL-Zertikate mit eigener ca erstellen.

Beide Wege führen nur bedingt und bei entsprechender Kenntnis zum Erfolg.

Das vorhandene Zertifikat kann man sich auch in der FHEM Kommandozeile anzeigen lassen.

{qx(openssl x509 -in ./certs/server-cert.pem -text -noout)}

Das Problem mit self signed

Das Endgerät muss das Zertikat vom Server akzeptieren, dazu müssen zwei Bedingungen erfüllt sein:

  1. Das System bzw. die Applikation (Browser) muss das Zertifikat der ausstellenden Stelle kennen um damit grundlegend die Vertrauenswürdigkeit überprüfen zu können.
  2. Das Serverzertifikat muss bestimmte Informationen enthalten, besondere Bedeutung haben die Einträge "Subject Alternative Name".

Zertifikate konform erstellen

Mit einer Befehlszeile (FHEM Kommandozeile) bekommt man die Serverzertikate ausgestellt und in einem "Standard FHEM" an die richtige Stelle. Falls der Pfad /certs noch nicht existiert, muss er zunächst angelegt werden!

Achtung! Die Aufrufe funktionieren erst ab openssl Version 1.1.1 .

"mkdir ./certs"
"openssl req -x509 -newkey rsa:2048 -sha256 -days 3650 -nodes -keyout ./certs/server-key.pem -out ./certs/server-cert.pem -subj '/CN=FHEM' -addext 'subjectAltName=DNS:localhost,DNS:raspib3plus,IP:127.0.0.1,IP:192.168.56.83'"

Universeller wäre ein Shellscript, welches die notwendigen Informationen vom System ermittelt. Um die richtigen Berechtigung zu erhalten, hier mit system Aufruf in FHEM gestartet.

{system q(openssl req -x509 -newkey rsa:2048 -sha256 -days 3650 -nodes -keyout ./certs/server-key.pem -out ./certs/server-cert.pem -subj "/CN=$(hostname|tr -d '\n')" -addext "subjectAltName=DNS:localhost,DNS:$(hostname|tr -d '\n'),DNS:$(host $(hostname) | awk '/has address/ { print $1 }'),IP:$(host $(hostname) | awk '/has address/ { print $4 }')")}

Diese Variante für die Shell funktioniert auch in früheren openssl Versionen.

openssl req -x509 -newkey rsa:2048 -sha256 -days 3650 -nodes \
  -keyout example.key -out example.crt -extensions san -config \
   <(echo "[req]";
    echo distinguished_name=req;
    echo "[san]";
    array=($(host $(hostname)|grep 'has address'));
    echo subjectAltName=DNS:localhost,DNS:$(hostname|tr -d '\n'),DNS:${array[0]},IP:${array[3]}
    ) \
  -subj "/CN=example.com"

ToDo

Oder ein Perlscript, welches auch noch die Konfigurationsoptionen von FHEM berücksichtigt.

ToDo: Das sind bisher nur Ansätze um die Daten über Perl zu ermitteln.

{use Sys::Hostname;; my $host = hostname()}
{use Socket;;my $ip="192.168.56.80";;$hostname = gethostbyaddr(inet_aton($ip),AF_INET)}
{use Socket;; use Net::Domain qw( hostfqdn );; my $host = hostfqdn();;my $addr = inet_ntoa(scalar(gethostbyname($host)))}

Hier gab es eine Diskussion im Forum.

ToDo

Code Block


1 Kommentar:

  1. Hallo Otto, (m)ein Traum ist wahr geworden. Login über ssl/https vom Windows-PC und iPhone in FHEM ohne ständige "FHEMWEB SSL/HTTPS error... -Fehler im Log.
    Genial!
    Ich mache da bestimmt schon 2 Jahre ohne Erfolg immer wieder nach diversen Anleitungen mit OpenSSL-Einzelbefehlen herum.
    Dein Aufruf für die FHEM-Befehlszeile hat auf Anhieb die Fehlermeldungen verbannt.
    fürs iPhone:
    "openssl x509 -inform PEM -outform DER -in server-cert.pem -out server-cert.crt" und die crt in Safari als Zertifikat geladen und aktiviert.
    Daaanke und Viele Grüße!
    Lars aus Karlsruhe

    AntwortenLöschen