Bestimmt kennt ihr das … ihr setzt eine eigene, lokale Nextcloud auf (z.B. auf einem Raspi mit NextCloudPi), funktioniert alles wunderbar. Aber in der URL meckert Chrome, Vivaldi oder Firefox, dass das https-Zertifikat nicht gültig ist.
Die Lösung: wir erstellen unsere eigene RootCA und ein Zertifikat für unseren raspi.
Hier eine hoffentlich Schritt-für-Schritt-Anleitung:
Vorbereiten – ein Linux
Wir brauchen ein Linux-System für openssl. Ich habe Windows10 und mache es mir daher einfach … WSL (Windows Subsystem für Linux) installiert und dann Ubuntu darauf laufen lassen. Ein Linux innerhalb von Windows, läuft wunderbar.
Falls ihr das auch wollt:
- WSL2 für Windows installieren
- Ubuntu 20.04 installieren aus dem Windows Shop
Zertifikate erzeugen
Zuerst benötigen benötigen wir einen privaten Schlüssel für unserer rootCA (heißt bei mir haschickCA). Also einfach eingeben:
openssl genrsa -aes256 -out haschickCA.key 4096
Dabei wird ein Passwort abgefragt. Dieses (wie auch die haschickCA.key) unbedingt geheim halten. Am besten in eurem Passwort-Manager (bspw. KeePass) speichern.
Dann benötigen wir das Root-Zertifikat (was wir in Windows, im Android, … installieren werden):
openssl req -x509 -new -nodes -extensions v3_ca -key haschickCA.key -sha256 -days 2136 -out haschickCA.crt
Jetzt haben wir unser Root-Zertifikat (in diesem Fall die Datei haschickCA.crt).
Nun weiter im Text mit dem eigentlichen Zertifikat für unseren raspi.
Die Logik ist fast analog:
- privaten Schlüssel erzeugen, aber diesmal ohne Passwort
- Zertifikatsanfrage erzeugen, von der CA signieren lassen -> das Ergebnis ist unser SSL-Zertifikat
Für Schritt 1 (privaten Schlüssel ohne Passwort erzeugen)
openssl genrsa -out raspi.key 4096
Für Schritt 2:
Zertifikatsanforderung (CSR – Certificate Signing Request) erzeugen:
openssl req -new -sha256 \
-key raspi.key \
-subj "/C=DE/ST=SN/O=Frank Haschick/OU=raspi/CN=raspi" \
-reqexts SAN \
-config <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:raspi")) \
-out raspi.csr
CSR signieren und damit Zertifikat anlegen
openssl x509 -req -extfile <(printf "subjectAltName=DNS:raspi\r\nextendedKeyUsage=serverAuth") -days 825 -in raspi.csr -CA haschickCA.crt -CAkey haschickCA.key -CAcreateserial -out raspi.crt -sha256
Die CSR-Datei benötigt man nicht mehr, die kann man wieder löschen
rm raspi.csr
Fertig, SSL-Zertifikat ist da 🙂
Falls ihr das Ubuntu auf dem WSL laufen habt (wie oben geschrieben), könnt ihr einfach
explorer.exe .
eingeben, und der Windows-Explorer wird gestartet mit genau dem Verzeichnis wo ihr gerade drin gewesen seid, wo also eure Zertifkate liegen.
Alternativ kann man im Windows Explorer auch „\wsl$\“ eingeben und dann zu seiner Linux-Distribution und seinem Verzeichnis wechseln
Zertifikat in raspi / Nextcloud hinterlegen
Jetzt wo ihr euer Zertifikat habt, müsst ihr es auf dem raspi hinterlegen.
Ihr benötigt euer rootCA (haschickCA.crt bei mir), die raspi.crt und die raspi.key.
Die auf den raspi kopieren und dann per SSH auf den raspi einloggen.
RootCA hinterlegen
Ihr solltet die RootCA nicht nur im Windows hinterlegen (dort bitte „Vertrauenswürdige Stammzertifizierungsstellen“ als Speicher auswählen), sondern auch im raspi.
Dazu die RootCA an die richtige Stelle kopieren:
sudo cp haschickCA.crt /usr/share/ca-certificates/haschickCA.crt
Und dann die CA-Pakete neu einlesen:
sudo dpkg-reconfigure ca-certificates
Dort dann das Zertifikat mit Leertaste auswählen und mit ENTER bestätigen.
Zertifikat in Apache hinterlegen
Erstmal kopieren wir unsere raspi-Schlüssel und das Zertifikat an die richtige Stelle:
sudo cp raspi.crt /etc/ssl/certs/raspi.crt
sudo cp raspi.key /etc/ssl/private/raspi.key
Welche Zertifikate von Apache genutzt werden, steht in der nextcloud.conf … also passieren wir die an:
sudo vi /etc/apache2/sites-enabled/nextcloud.conf
Wer mit vi nicht so gut umgehen kann … „i“ drücken zum einfügen.
Dann die 2 Zeilen austauschen (bei mir Zeile 7 und 8):
SSLCertificateFile /etc/ssl/certs/raspi.crt
SSLCertificateKeyFile /etc/ssl/private/raspi.key
Zum Speichern „Escape“ drücken, dann „:wq!“ (alles ohne die „).
Dann noch von Apache die Config neu einlesen lassen:
sudo systemctl reload apache2
Dann probiert es im Browser aus: https://raspi sollte keine Fehlermeldung mehr erzeugen.
Viel Erfolg!
Update 16.03.2021
Das oben beschriebene funktioniert mit Windows und Android, aber nicht mit iOS. Dort gibt es seit iOS 13 neue Regeln (825 Tage Gültigkeit und extendedKeyUsage ergänzt) -> geht jetzt auch auf iOS