Lokale Certificate Authority bauen

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert