Site x5

X.509 Server Zertifikate

Einleitung

Nachdem wir im vorherigen Schritt unsere eigene Root-CA erstellt haben, können wir diese nun nutzen, um eigene Zertifikate für Server oder Clients auszustellen. Der Ablauf ist dabei immer gleich:

So entsteht eine Vertrauenskette: Das ausgestellte Zertifikat wird von unserer Root-CA bestätigt – und jedes Gerät, das unserer Root-CA vertraut, akzeptiert auch dieses neue Zertifikat.

Vorbereitung

Server Schlüssel erstellen

Wir erstellen wieder einen privaten Schlüssel, dieses Mal für den Server:

openssl genrsa -out myServer.key 2048

CSR erstellen

Ein CSR (Certificate Signing Request) ist eine Datei, die alle wichtigen Informationen für ein Zertifikat enthält , z. B. den öffentlichen Schlüssel, den Common Name (Domainname) und optionale Angaben wie Organisation oder Standort. Sie wird mit dem privaten Schlüssel erzeugt und anschließend an eine Zertifizierungsstelle (in unserem Fall unsere eigene Root-CA) geschickt, um daraus ein signiertes Zertifikat zu erstellen.

openssl req -new -nodes -key myServer.key -out myServer.csr

Uns werden jetzt wieder Fragen zu den Distinguished Name Feldern gefragt, bis auf Common Name können wir auch hier fast alles leer lassen.

Jetzt haben wir zwei neue Dateien:

root@debian-vm:~/certs# ls -l
insgesamt 16
-rw-r--r-- 1 root root 1257 12. Aug 14:57 myCA.crt
-rw------- 1 root root 1704 12. Aug 14:56 myCA.key
-rw-r--r-- 1 root root  976 15. Aug 09:13 myServer.csr
-rw------- 1 root root 1704 15. Aug 09:12 myServer.key

Wir können unseren Server CSR überprüfen:

openssl req -in myServer.csr -noout -text

CSR signieren

Mit dem erstellten CSR (Certificate Signing Request) würden wir normalerweise zu einer öffentlichen Zertifizierungsstelle (z.B. Let's Encrypt) gehen, um ein signiertes Zertifikat zu erhalten. In unserem Fall nutzen wir jedoch unsere eigene Root-CA, um den CSR zu signieren und so ein vertrauenswürdiges Zertifikat für unseren Server oder Client auszustellen.

Damit unser Zertifikat später von den Clients (z.B. Webbrowser) akzeptiert wird, brauchen wir noch die SAN-Extension.

Wir erstellen eine extensions-Datei mit folgendem Inhalt:

nano myServer.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = myServer.test   # Wenn unser Server unter einer Domain erreichbar ist
IP.1 = 172.31.32.118    # Wenn unser Server unter einer IP erreichbar ist

Nun können wir den CSR mit unserem Root-CA Key signieren:

openssl x509 -req -in myServer.csr -CA myCA.crt -CAkey myCA.key -out myServer.crt -days 825 -sha256 -extfile myServer.ext

Wir prüfen nun das Server Zertifikat:

openssl x509 -in myServer.crt -noout -text

Wie zu erkennen ist, sind Issuer und Subjekt nicht mehr die gleiche Entität. Das Server Zertifikat wurde von unserer Root-CA signiert.

Server Zertifikat einsetzen

Die beiden Dateien

können wir jetzt verwenden, um die Kommunikation eines Servers (z.B. nginx oder mosquitto) über TLS abzusichern.

Beispielhafte Konfiguration:

Nginx (Webserver)

Mosquitto (MQTT Broker)

Zusammenfassung

Tipp: Bewahre den Root-CA-Schlüssel besonders sicher auf - wer Zugriff darauf hat, kann Zertifikate ausstellen, die von allen vertrauenswürdigen Systemen akzeptiert werden.