Ab und zu steht man vor dem Problem, dass man ein Zertifikat für seine Website benötigt, die nicht übers Internet erreichbar ist. Ein gutes Beispiel kann hier etwa die eigene Heimautomatisierung sein.
Verwendet man etwa homeassistant.fritz.box als lokale Adresse, dann kann man die Website zwar einfach per HTTP über http://homeassistant.fritz.box:8123 aufrufen, hat dabei aber mit einigen Nachteilen zu kämpfen. Einer davon ist, dass bestimmte (meist neuere) Browser-APIs nicht funktionieren. Eine Lösung für dieses Problem beschreiben die nachfolgenden Zeilen.
Im Prinzip braucht man zwei Komponenten, um das Problem zu lösen. Einerseits braucht man ein Zertifikat, das für die HTTPS Verschlüsselung herangezogen werden kann. Andererseits benötigt man einen Proxy-Server, der die Kommunikation am HTTPS-Endpunkt entgegennimmt und auf den internen Endpunkt (also http://homeassistant.fritz.box:8123) weiterleitet.
Ersteres lässt sich noch „relativ einfach“ mit folgendem OpenSSL Befehle erstellen (das Beispiel erstellt ein für 10 Jahre gültiges Zertifikat, das aus einem .key file und dem .crt Zertifikat besteht):
openssl req -x509 -newkey rsa:4096 -keyout fritz_box1.key -out fritz_box1.crt -sha256 -days 3650 -nodes -subj "/CN=*.fritz.box/" --addext "subjectAltName=DNS.1:fritz.box,DNS.2:*.fritz.box"
Beim Proxy-Server gibt es viele verschiedene Optionen, eine verbreitete ist hier der Nginx Proxy Manager.
Damit ist es möglich das eben erstellte Zertifikat (unter „Certificates“ als so genanntes „Custom Certificate“ – das aus den beiden per openssl Befehl erstellten .key und .crt Dateien besteht) einzufügen und in der Proxy-Host SSL-Konfiguration zu hinterlegen.
Zum Abschluss sollte man noch das selbst signierte Zertifikat im Browser hinterlegen (in Chrome etwa unter „Sicherheit->Zertifikate verwalten->Von dir installiert“) und schon hat man eine sichere Verbindung zur https://homeassistant.fritz.box umgesetzt, mit der sich auch neuere Browser-APIs verwenden lassen.