Eigene CA betreiben – Schritt 4 (Zertifikate für die Server erzeugen und installieren)

Nachdem wir in Teil 2 bzw. Teil 3 unser Root-Zertifikat auf den Clients installiert haben, kommen wir nun zum eigentlichen Zweck des Ganzen. Wir erzeugen für unseren Webserver ein Zertifikat und binden es ein, so dass die aufrufenden Clients eine verschlüsselte und sichere Verbindung bekommen.

Leider gibt es kein einheitliches Vorgehen zum Installieren der Server, da dies je nach verwendeter Software (Apache, Nginx, Drucker, etc.) immer etwas unterschiedlich ist. Ich werde diesen Beitrag daher nach und nach ergänzen, ganz so wie mir die unterschiedlichen Anwendungen unterkommen.

Der grundlegende Ablauf ist jedoch immer identisch (Key erzeugen -> CSR generieren -> Extension-Datei anpassen -> Zertifikat erzeugen -> Zertifikat installieren), so dass ihr das sicher auch hinbekommt, wenn die von Euch verwendete Software hier nicht auftaucht.

VCSA (VMware vCenter Server Appliance) 6.7

Zunächst einmal in der VCSA einloggen und zu Startseite – Verwaltung – Zertifikatsverwaltung navigieren. Klickt man dann beim __MACHINE_CERT auf Details sollte das dann ungefähr so aussehen:

Default Maschinen-SSL-Zertifikat der VCSA, welches nicht von unserer CA ausgestellt wurde.

Das Maschinen-SSL-Zertifikat ist also nicht von unserer eigenen CA ausgestellt und die Verbindung zur VCSA wird daher im Browser als „nicht sicher“ angezeigt.

Das möchte ich natürlich ändern und logge mich daher auf dem Rechner ein, den ich schon zur Erstellung der Root-CA genutzt habe.

Zunächst generiere ich den privaten Schlüssel für die VCSA.

sudo openssl genrsa -out vcsa-server.key 4096
Generating RSA private key, 4096 bit long modulus
.....++
...++
e is 65537 (0x10001)

Mit diesem Key erzeuge ich nun den dazu gehörenden CSR. Wichtig hierbei ist, dass das geforderte challenge password leer bleibt, also bei dieser Abfrage einfach Enter drücken. Die anderen Fragen natürlich mit den bei Euch passenden Werten füllen, logisch.

sudo openssl req -new -key vcsa-server.key -out vcsa-server.csr -sha512
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:NRW
Locality Name (eg, city) []:Titz
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Fafa4 - Beoweos und Elwes
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:vcsa-server.fafa4.local
Email Address []:edv@fafa4.local

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Diesen CSR könnte ich jetzt bereits nutzen, um daraus ein Zertifikat für unsere VCSA zu erstellen, allerdings möchte ich auch, dass dieses Zertifikat nicht nur für den FQDN des Rechners gilt, sondern auch für die IP-Adresse. Ansonsten würde eine Verbindung zu https://vcsa-server.fafa4.local im Browser als sicher angezeigt, eine Verbindung zu https://10.6.82.32 jedoch als unsicher, was natürlich blöd ist.

Wie ihr beim Erzeugen des CSR sicher bemerkt habt, habe ich dort nirgendwo die Möglichkeit eine IP anzugeben, sondern es wird lediglich der FQDN abgefragt. Geht natürlich trotzdem über die OpenSSL SAN Extension, hierzu lege ich eine Datei namens vcsa-server.conf mit diesem Inhalt an.

[SAN]
subjectAltName = @alt_names

[alt_names]
DNS.2 = vcsa-server
DNS.1 = vcsa-server.fafa4.local
IP = 10.6.82.32

Nun kann ich wirklich das Zertifikat erzeugen, welches 3 Jahre gültig sein soll. Hierbei werdet ihr nach dem Passwort des CA-Keys gefragt, ansonsten sind alle benötigen Angaben im CSR enthalten.

sudo openssl x509 -req -days 1095 -in vcsa-server.csr -CA /root/CA/Fafa4-CA.pem -CAkey /root/CA/Fafa4-CA.key -CAcreateserial -out vcsa-server.pem -extfile vcsa-server.conf -extensions SAN
Signature ok
subject=/C=DE/ST=NRW/L=Titz/O=Fafa4 - Beoweos und Elwes/OU=IT/CN=vcsa-server.fafa4.local/emailAddress=edv@fafa4.local
Getting CA Private Key
Enter pass phrase for /root/CA/Fafa4-CA.key:

Nun habe ich das von unserer CA ausgestellte Zertifikat unter dem Namen vcsa-server.pem vorliegen, dieses kopiere ich temporär auf meine lokale Festplatte und wechsle wieder zurück zur VCSA-Oberfläche.

Beim __MACHINE_CERT wähle ich unter „Aktionen“ den Punkt „Ersetzen“, worauf sich folgendes Fenster öffnet.

Hier wähle ich unsere eben erzeugten vcsa-server.pem und vcsa-server.key aus und klicke auf „Ersetzen“.

Das war dann auch schon alles, nach einem Reboot der VCSA über die Managementoberfläche wird das neue Zertifikat verwendet.

Ciphermail

Wir verwenden Ciphermail um ein- und ausgehende Mails automatisch zu signieren, ggf. zu ver- bzw. entschlüsseln und einiges mehr. Gerade in diesem Bereich ist es natürlich angebracht ein vertrauenswürdiges Zertifikat für die Weboberfläche zu präsentieren.

In Ciphermail navigiere ich zu Admin – SSL/TLS – Web, was dann ungefähr so aussehen sollte.

Konfigurationsoberfläche von Ciphermail für die Zertifikatverwaltung der Weboberfläche

Ciphermail hätte gerne eine PKCS#12-Datei, die den private Key des Ciphermail-Servers, das Zertifikat unserer internen CA und natürlich das von der CA ausgestellte Zertifkat für Ciphermail enthält.

Los geht es wie üblich indem ich den private-Key des Ciphermail-Servers erstellen.

sudo openssl genrsa -out ciphermail.key 4096
Generating RSA private key, 4096 bit long modulus
..................................++
......................................................................................................................................................................................++
e is 65537 (0x10001)

Nun erzeuge ich den entsprechenden CSR, das challenge Password bleibt leer, der Rest der Felder wird mit sinnvollen Werten gefüllt.

sudo openssl req -new -key ciphermail.key -out ciphermail.csr -sha512
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:NRW
Locality Name (eg, city) []:Titz
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Fafa4 - Beoweos und Elwes
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:ciphermail.fafa4.local
Email Address []:edv@fafa4.local

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Für die obligatorische SAN Extension lege ich eine Datei namens ciphermail.conf mit diesem Inhalt an.

[SAN]
subjectAltName = @alt_names

[alt_names]
DNS.2 = ciphermail
DNS.1 = ciphermail.fafa4.local
IP = 10.217.82.99

Nun habe ich alles um das Zertifikat für Ciphermail zu erzeugen, als Gültigkeit wähle ich 3 Jahre, aber das ist natürlich Geschmackssache.

sudo openssl x509 -req -days 1095 -in ciphermail.csr -CA /root/CA/Fafa4-CA.pem -CAkey /root/CA/Fafa4-CA.key -CAcreateserial -out ciphermail.pem -extfile ciphermail.conf -extensions SAN
Signature ok
subject=/C=DE/ST=NRW/L=Titz/O=Fafa4 - Beoweos und Elwes/OU=IT/CN=ciphermail.fafa4.local/emailAddress=edv@fafa4.local
Getting CA Private Key
Enter pass phrase for /root/CA/Fafa4-CA.key:

Da Ciphermail eine PKCS#12-Datei erwartet, wandel ich das per OpenSSL entsprechend um. Das Export-Passwort spielt keine größere Rolle, es wird nur einmalig von Ciphermail bei der Installation des Zertifikats abgefragt.

sudo openssl pkcs12 -export -out ciphermail.p12 -inkey ciphermail.key -in ciphermail.pem -certfile Fafa4-CA.pem
Enter Export Password:
Verifying - Enter Export Password:

Die so erzeuge ciphermail.p12 lade ich in der Ciphermail Weboberfläche hoch, gebe das Export-Kennwort ein und nach einem Neustart des Webservers von Ciphermail wird das neue Zertifikat verwendet.

Das Zertifikat wurde erfolgreich installiert, nach einem Neustart des Webservers wird es verwendet.

Unifi Network Controller Software

Wie üblich erstelle ich zunächst den private Key des Servers.

sudo openssl genrsa -out unifi.key 4096
Generating RSA private key, 4096 bit long modulus
.++
......................................................++
e is 65537 (0x10001)

Den CSR erstellen und mit sinnvollen Werten füllen.

sudo openssl req -new -key unifi.key -out unifi.csr -sha512
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:NRW
Locality Name (eg, city) []:Titz
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Fafa4 - Beoweos und Elwes
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:ubiquiti.fafa4.local
Email Address []:edv@fafa4.local

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Für die SAN Extension lege ich eine Datei namens unifi.conf mit folgendem Inhalt an.

[SAN]
subjectAltName = @alt_names

[alt_names]
DNS.2 = ubiquiti
DNS.1 = ubiquiti.fafa4.local
IP = 10.6.82.136

Nun kann ich das eigentliche Zertifikat erstellen.

sudo openssl x509 -req -days 1095 -in unifi.csr -CA /root/CA/Fafa4-CA.pem -CAkey /root/CA/Fafa4-CA.key -CAcreateserial -out unifi.pem -extfile unifi.conf -extensions SAN
Signature ok
subject=/C=DE/ST=NRW/L=Titz/O=Fafa4 - Beoweos und Elwes/OU=IT/CN=ubiquiti.fafa4.local/emailAddress=edv@fafa4.local
Getting CA Private Key
Enter pass phrase for /root/CA/Fafa4-CA.key:

Die Unifi Software nutzt den Java Keystore, so dass wir alles in ein PKCS#12 packen müssen. Das angeforderte Export-Passwort ist nicht weiter kritisch, es wird lediglich beim Import abgefragt. Ich nehme hier mal „banane“ als Kennwort.

sudo openssl pkcs12 -export -nodes -out unifi.p12 -inkey unifi.key -in unifi.pem -certfile /root/CA/Fafa4-CA.pem -name unifi
Enter Export Password:
Verifying - Enter Export Password:

Die so erzeugte unifi.p12 kopiere ich per WinSCP in mein Home-Verzeichnis auf den Rechner, auf dem der Unifi Network Controller läuft.

Zunächst schaue ich mir an welche Zertifikate sich in dem vom der Unifi Network Controller verwendeten Keystore befinden. Das hierbei benötigte Kennwort lautet als Default aircontrolenterprise.

sudo keytool -list -keystore /var/lib/unifi/keystore
Keystore-Kennwort eingeben:
Keystore-Typ: jks
Keystore-Provider: SUN

Keystore enthält 1 Eintrag

unifi, 27.11.2019, PrivateKeyEntry,
Zertifikat-Fingerprint (SHA1): 29:BD:36:01:93:99:FE:5D:93:D8:F2:5B:CA:32:D8:1E:9F:64:EF:26

Dort befindet sich wie erwartet nur der unifi-Alias, dieses Zertifikat lösche ich nun.

sudo keytool -delete -alias unifi -keystore /var/lib/unifi/keystore

Nun kann ich unser Zertifikat importieren.

sudo keytool -importkeystore -srckeystore /home/edv/unifi.p12 -srcstorepass banane -destkeystore /var/lib/unifi/keystore -deststorepass aircontrolenterprise -alias unifi -trustcacerts
Keystore /home/edv/unifi.p12 wird in /var/lib/unifi/keystore importiert...

Jetzt noch den Dienst neu starten und das war’s dann auch schon.

sudo systemctl restart unifi

Payara (Glassfish)

Auch hier wird zunächst der private Key des Servers erstellt.

sudo openssl genrsa -out clp-sam.key 4096
Generating RSA private key, 4096 bit long modulus (2 primes)
..................................................................................................................++++
.............................................................++++
e is 65537 (0x010001)

Nun den CSR erstellen und mit sinnvollen Werten füllen.

sudo openssl req -new -key clp-sam.key -out clp-sam.csr -sha512
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [DE]:
State or Province Name (full name) [NRW]:
Locality Name (eg, city) [Titz]:
Organization Name (eg, company) [Fafa4 - Beoweos und Elwes]:
Organizational Unit Name (eg, section) [IT]:
Common Name (e.g. server FQDN or YOUR name) [clp-sam.fafa4.local]:
Email Address [edv@fafa4.local]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Für die SAN-Extension lege ich eine Datei clp-sam.conf im Unterverzeichnis configs/ mit folgendem Inhalt an.

[SAN]
subjectAltName = @alt_names

[alt_names]
DNS.2 = clp-sam
DNS.1 = clp-sam.fafa4.local
IP = 192.168.178.126

Nun kann ich das eigentliche Zertifikat erstellen, in diesem Falls soll es 2 Jahre gültig sein.

sudo openssl x509 -req -days 730 -in clp-sam.csr -CA Fafa4-CA.pem -CAkey Fafa4-CA.key -CAcreateserial -out clp-sam.pem -extfile configs/clp-sam.conf -extensions SAN
Signature ok
subject=C = DE, ST = NRW, L = Titz, O = Fafa4 - Beoweos und Elwes, OU = IT, CN = clp-sam.fafa4.local, emailAddress = edv@fafa4.local
Getting CA Private Key
Enter pass phrase for Fafa4-CA.key:

Payara verwendet den Java-Keystore, so dass ich unsere Zertifkate noch in diesen importieren muss, hierzu kopiere ich das soeben erstellte Zertifikat (clp-sam.pem), den dazu gehörenden Key (clp-sam.key) und unser CA-Zertifikat (Fafa4-CA.pem) auf den Payara-Server in das Verzeichnis /opt/payara41/glassfish/domains/payaradomain/config.

Bevor ich irgendetwas an den Keystore-Dateien anstelle, sichere ich mir die Originaldateien natürlich, so dass ich im Fehlerfall wieder zurück kann.

# cp keystore.jks keystore.clp
# cp cacerts.jks cacerts.clp

Nun lösche ich aus den beiden Keystores die Zertifkate mit dem Alias s1as.

# keytool -delete -alias s1as -keystore keystore.jks
# keytool -delete -alias s1as -keystore cacerts.jks

Nachdem die bestehenden Zertifikate gelöscht sind, erstelle ich eine Zertifikatskette und füge sie dem Keystore hinzu mittels

# cat clp-sam.pem Fafa4-CA.pem > all.pem
# openssl pkcs12 -export -in all.pem -inkey clp-sam.key -name s1as -passout pass:changeit > akeystore.p12
# keytool -importkeystore -srckeystore akeystore.p12 -srcstoretype PKCS12 -srcstorepass changeit -deststorepass changeit -destkeypass changeit -destkeystore keystore.jks -alias s1as -destalias s1as

Nun noch einen Neustart von Payara und damit ist das eigene Zertifikat installiert und wird verwendet.

# asadmin restart-domain payaradomain