Im Homelab tritt das Problem auf, dass es für lokale Systeme kein gültiges Zertifikat gibt, da diese nicht von einer global anerkannten CA signiert sind.

Es gibt mehrere Optionen, das zu lösen:
– Selbstsigniertes Zertifikat als vertrautes Zertifikat hinzufügen.
→ muss pro Maschine und Zertifikat passieren (in der Regel 1 Jahr gültig)
– Eigenes CA erzeugen, dieses als vertrautes Zertifikat hinzufügen und Zertifikate mit diesem signieren.
→ Das CA-Zertifikat muss auf jeder Maschine einzeln ausgerollt werden (in der Regel 10 Jahre gültig).
→ Alle Zertifikate, die mit diesen signiert sind, werden als gültig erkannt.
– Global routfähige Domain (z. B. salsona.com) benutzen und Webserver öffentlich erreichbar machen.
-> In diesem Fall kann ein Zertifikat z. B. via LetsEncrypt (ACME) Automatisch erstellt und aktualisiert werden.
Wir behandeln nun die Option: CA-Zertifikat
Certificate-Authority-Zertifikat erstellen
Zuerst muss auf dem System „openssl“ installiert werden. Auf einem Debian-System:
apt install OpenSSL
Anschließend erstellen wir den CA-Schlüssel und das selbstsignierte CA-Zertifikat.
Beim Erstellen des CRT wird man nach den folgenden optionalen Feldern gefragt:
Land, Bundesland, Stadt, Organisationsname, Organisationsabteilung, Name (hier z. B. Locale Saslona Root CA) und eine E-Mail
openssl ecparam -genkey -name prime256v1 -out ca.key
openssl req -x509 -new -SHA384 -nodes -key ca.key -days 3650 -out ca.crtCode-Sprache: CSS (css)
Client/Server-Zertifikat erstellen
Nun können wir einen Schlüssel für das Client/Server-Zertifikat erstellen.
Beim Erstellen des CRT wird man nach den folgenden optionalen Feldern gefragt:
Land, Bundesland, Stadt, Organisationsname, Organisationsabteilung, Name (hier: server1.saslona.local ) und eine E-Mail
openssl ecparam -genkey -name prime256v1 -out server1.saslona.local.key
openssl req -new -key server1.saslona.local.key -out server1.saslona.local.csrCode-Sprache: CSS (css)
Dann erstellen wir eine „extensions“-Datei, um dem Zertifikat weitere Informationen mitzugeben.
Angepasst werden muss hier nur die „[alt_names]“-Liste mit den FQDNs und IPs, unter denen der Server erreichbar ist.
Die Datei kann z. B. „server1.saslona.local.ext“ genannt werden und sieht wie folgt aus.
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.178.2
DNS.1 = server1.saslona.localCode-Sprache: PHP (php)
Jetzt wird der Certifikat für den Server erstellt
openssl x509 -req -SHA384 -extfile server1.saslona.local.ext -days 365 -in server1.saslona.local.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server1.saslona.local.crtCode-Sprache: CSS (css)
Script zum Generieren eines signierten Zertifikates (ca.key und ca.crt müssen vorhanden sein)
„#“ der Letzen Zeile endfernen um PFX zu generieren
# USAGE: ./caSignedCert.sh <list of other filenames and IPs>
# example: ./caSignedCert.sh myserver.example.com 192.168.1.1
# CA files: ca.crt, ca.key
if ! command -v openssl &> /dev/null
then
echo "openssl could not be found. Please install openssl to use this script."
exit
fi
if [ ! -f "ca.crt" ]; then
echo "CA certificate (ca.crt) not found. Please ensure it is in the current directory."
exit 1
fi
if [ ! -f "ca.key" ]; then
echo "CA private key (ca.key) not found. Please ensure it is in the current directory."
exit 1
fi
if [ "$#" -lt 1 ]; then
echo "USAGE: ./caSignedCert.sh <list of other FQDNs and IPs>"
exit 1
fi
filename="$1"
cat > "$filename.ext" << EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
EOF
ip=1
dns=1
for arg in "$@"
do
# match IPv4 addresses (four octets) or IPv6 addresses (eight groups of four hexadecimal digits)
if [[ $arg =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
echo "IP.$ip = $arg" >> $filename.ext
ip=$((ip+1))
elif [[ $arg =~ ^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$ ]]; then
echo "IP.$ip = $arg" >> $filename.ext
ip=$((ip+1))
else
echo "DNS.$dns = $arg" >> $filename.ext
dns=$((dns+1))
fi
done
openssl ecparam -genkey -name prime256v1 -out $filename.key
openssl req -new -key $filename.key -out $filename.csr
openssl x509 -req -SHA384 -extfile $filename.ext -days 365 -in $filename.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out $filename.crt
#openssl pkcs12 -export -out $filename.pfx -inkey $filename.key -in $filename.crt -certfile ca.crt
Code-Sprache: PHP (php)Das CA-Zertifikat als Vertrautes Zertifikat hinzufügen
Windows
Zertifikats-Speicher öffnen: „Win + r“ drücken und „certlm.msc“ eingeben und Admin-Prompt bestätigen.
„Vertrauenswürdige Stammzertifizierungsstellen“ -> „Zertifikate“ (Rechtsklick) -> „Alle Aufgaben“ -> „Importieren“ auswählen und als Datei „ca.crt“ auswählen.
Signierte Zertifikate nutzen
Proxmox
Zu gewünschtem Server navigieren und unter „System“, „Certifikate“ auswählen. Dort „Zertifikat hochladen“ klicken und den Inhalt von „server1.saslona.local.key“ als privaten Schlüssel und „server1.saslona.local.crt“ als Zertifikat eingeben.
Nginx Proxy Manager
Zertifikate → Zertifikat hinzufügen -> Benutzerdefiniertes Zertifikat:
– Privater Schlüssel „.key“-Datei
– Zertifikat: „.crt“-Datei
– Zwischenzertifikat: „ca.crt“
Technitium DNS
PFX generieren und password vergeben:
openssl pkcs12 -export -out .pfx -inkey .key -in .crt -certfile ca.crtCode-Sprache: CSS (css)
PFX auf dem Tchnitium DNS Server in „/etc/dns/DATEI.pfx“ ablegen.
In Technitium dns unter Einstellungen -> Web Dienst -> TLS Zertifikate Dateipfad „/etc/dns/DATEI.pfx“ eingeben
Password vom PFX bei „TLS Zertifikate Password“ eingeben.
DNS Server neustarten