Serverzertifikat mittels lokaler Zertifizierungsstelle (CA) signieren

Im Beitrag Lokale Zertifizierungsstelle (certificate authority – CA) erstellen haben wir auf einen Server eine lokale Zertifizierungsstelle erstellt mittels der wir lokale Zertifikate signieren können.

In diesem Beitrag erstellen wir auf unserem Webserver eine Zertifikatsanfrage (Certificate Signing Request – CSR) welche wir mittels unserer Zertifizierungsstelle signieren und damit ein gültiges Zertifikat bekommen.

Im Beispiel erstelle ich ein Zertifikat für einen Webseiter welche unter https://server.domain.tld erreichbar ist.
Natürlich müssen wir für unseren Server den vollqualifizierten Namen (Fully Qualified Domain Name – FQDN) der eigenen Domain angeben.

Zertifikatsanfrage erstellen

Da Google Chrome seit der Version 58 das Feld Common Name aus dem Zertifikat ignoriert und nun die Einträge aus den Feld Alternativer Antragstellername (Subject Alternative Name – SAN) zur Überprüfung verwendet, die SAN in OpenSSL jedoch nicht in der Befehlszeile angeben werden können, müssen wir uns bei der Zertifikatsanfrage und sie Signierung mit Konfigurationsdateien helfen.

Um den Webserver-Dienst ohne Passwortabfrage starten zu können, erstellen wir einen privaten Schlüssel ohne Passwort:

root@myserver:~/etc/ssl/private# openssl genrsa -out myserver.domain.tld.key 4096
Generating RSA private key, 4096 bit long modulus
..............................................................................++
e is 65537 (0x10001)
Enter pass phrase for myserver.domain.tld.key:
Verifying - Enter pass phrase for myserver.domain.tld.key:

Nun erstellen wir eine Datei namens createcsr.conf mit folgendem Inhalt, natürlich nach unseren Anforderungen angepasst:

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = AT
stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = VIENNA
localityName = Locality Name (eg, city)
localityName_default = Vienna
organizationName = Organization Name (eg, company) organizationName_default = TestFirma
organizationalUnitName = Organizational Unit Name (eg, section) organizationalUnitName_default = Administration
commonName = Common Name (e.g. server FQDN or YOUR name) commonName_default = myserver 

[v3_req]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names 

[alt_names]
DNS.1 = myserver
DNS.2 = myserver.domain.tld
IP.1 = 192.168.0.100 

Mit dieser Konfigurationsdatei können wir unsere Zertifikatsanfrage erstellen:

root@myserver:~# openssl req -new -key /etc/ssl/private/myserver.domain.tld.key -out myserver.domain.tld.csr -config createcsr.conf

Die Zertifikatsanfrage können wir wie folgt überprüfen:

root@myserver:~# openssl req -noout -text -in myserver.domain.tld.csr

Zertifikatsanfrage signieren

Die Signierung der Zertifikatsanfrage erfolgt nun auf den Server, auf den wir die lokale Zertifizierungsstelle eingerichtet haben.

Wir erstellen ein neues Unterverzeichnis im Verzeichnis CA mit dem Namen myserver und kopieren die Zertifikatsanfrage myserver.domain.tld.csr hinein.

Um die Zertifikatsanfrage mit den SAN-Einträgen signieren zu können benötigen wir wiederum eine Konfigurationsdatei.
Wir erstellen eine Datei mit dem Namen signcsr.conf und folgendem Inhalt im Verzeichnis myserver, natürlich wieder nach unseren Anforderungen angepasst:

[SAN]
subjectAltName = @alt_names

[alt_names]
DNS.2 = myserver
DNS.1 = myserver.domain.tld
IP = 192.168.0.100 

Wir können nun unsere Zertifikatsanfrage signieren, benötigen jedoch das Passwort für den privaten Schlüssel der lokalen Zertifizierungsstelle:

root@rpitest:~/CA/myserver# openssl x509 -req -days 3650 -in myserver.domain.tld.csr -CA ../ca-testfirma.crt -CAkey ../ca-testfirma.key -set_serial 01 -out myserver.domain.tld.pem -extfile signcsr.conf -extensions SAN
Signature ok
subject=C = AT, ST = VIENNA, L = Vienna, O = TestFirma, OU = Administration, CN = myserver
Getting CA Private Key
Enter pass phrase for ../ca.key:

Firefox lässt kein Zertifikat zu welches die gleiche Seriennummer hat wie ein bereits bestehendes (Error code: sec_error_reused_issuer_and_serial). Für weitere Zertifikate bei -set_serial fortlaufende Nummern verwenden!

Das Zertifikat können wir wie folgt überprüfen:

root@rpitest:~/CA/myserver# openssl x509 -noout -text -in myserver.domain.tld.pem

Das Zertifikat myserver.domain.tld.crt kopieren wir nun ins Verzeichnis /etc/ssl/certs auf unseren Webserver und verwenden es dort für die Einrichtung der SSL-Webseite.