Ubuntu Server 14.04 – SAN-Zertifikate erstellen

Stellt man mit einer eigenen Certificate Authority („CA“) mit OpenSSL ein Serverzertifikat aus, so gilt dieses standardmäßig nur für die im Common Name („CN“) des Zertifikats angegebene Domain. Bei einem Server mit mehreren vollqualifizierten Domainnamen („Fully Qualified Domain Name“, „FQDN“) wie www.test.local, mail.test.local usw., muss daher für jeden FQDN eine eigenes Zertifikat erzeugt werden.
Man kann sich die Zertifikatserstellung erleichtern, indem man die Erweiterung Subject Alternative Name („SAN“) des in RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile der Internet Engineering Task Force IETF spezifizierten Standards X.509 nutzt. Damit können in nur einem SAN-Zertifikat alle Domains aufgelistet werden, für die das Zertifikat gültig sein soll. Neben Domainnamen sind hier u. a. auch Einträge für IP-Adressen und E-Mail-Adressen möglich.
Die alternativ einsetzbaren Wildcard-Zertifikate sind nicht so flexibel, da sie nur eine Ebene einer einzigen Domain umfassen. Ein Zertifikat für *.test.local schützt z. B. die FQDN www.test.local und mail.test.local, nicht aber test.local und www.de.test.local oder ftp.dummy.private. Vorteilhaft gegenüber SAN-Zertifikaten ist, dass ein Wildcard-Zertifikat nicht bei jeder Änderung der Domainliste neu ausgestellt werden muss.
Die folgende Anleitung zum Anlegen von SAN-Zertifikaten mit OpenSSL ist eine Ergänzung zum Beitrag Ubuntu Server 14.04 – Certificate Authority mit OpenSSL einrichten.

Voraussetzungen

Wir haben unseren Server z. B. gemäß der Anleitung zur Basisinstallation für Ubuntu Server 14.04 installiert und durch Updates / Upgrades auf den neuesten Stand gebracht. Der Server hat den Rechnernamen server und gehört zur Domain test.local. Die Befehle führen wir mit Root-Rechten aus, z. B. nach Öffnen einer Rootshell mit sudo -i.
OpenSSL gehört zum Installationsumfang von Ubuntu Server 14.04 und sollte daher bereits auf unserem Server vorhanden sein. Falls nicht, können wir es wie folgt nachinstallieren:

root@server:~# apt install openssl

OpenSSL-Konfiguration anpassen

Um mit OpenSSL SAN-Zertifikate ausstellen zu können, ist eine modifizierte Version der Konfigurationsdatei /etc/ssl/openssl.cnf erforderlich. Neben einigen globalen Anweisungen nach dem Schema Name = Wert am Anfang enthält diese Datei im Wesentlichen Konfigurationabschnitte mit Überschriften in der Form [ Abschnitt ], unter denen mehrere Anweisungen zusammengefasst sind.
Als Grundlage erstellen wir zunächst mit

root@server:~# cp /etc/ssl/openssl.cnf /etc/ssl/openssl-san.cnf

eine Kopie der Konfigurationsdatei und ergänzen openssl-san.cnf dann wie folgt:

...
[ req ]
...
# req_extensions = v3_req # The extensions to add to a certificate request
req_extensions = v3_req # The extensions to add to a certificate request
...
[ v3_req ]
...
subjectAltName = @alt_names
...
[ alt_names ]
DNS.1 = test.local
DNS.2 = www.test.local
DNS.3 = mail.test.local

Damit der Inhalt des Abschnitts [ v3_req ] mit Zertifikats-Erweiterungen bei einer Zertifikatsanfrage berücksichtigt wird, entfernen wir das Kommentarzeichen # vor der Anweisung req_extensions = v3_req im Konfigurationabschnitt [ req ]. In [ v3_req ] fügen wir einen zusätzlichen Eintrag subjectAltName für die Domainnamen ein, für die das SAN-Zertifikat gelten soll. Statt die Domains in einer durch Komma getrennten Aufzählung anzugeben, werden sie der Übersichtlichkeit halber in einem eigenen neuen Konfigurationabschnitt [ alt_names ] aufgelistet, auf den wir mit @alt_names verweisen. Pro Domain tragen wir hier eine Zeile mit dem Aufbau DNS.x = FQDN mit x als fortlaufender Nummerierung ein. Ein im Common Name aufgeführter Domainname wird bei einem vorhandenen subjectAltName-Eintrag ignoriert und muss daher bei Bedarf ebenfalls in der Liste angegeben werden.
Subject Alternative Names und weitere Zertifikats-Erweiterungen von OpenSSL werden in x509v3_config detaillierter beschrieben.

Serverzertifikat erstellen

Die folgenden Ausführungen basieren auf dem Artikel Ubuntu Server 14.04 – Certificate Authority mit OpenSSL einrichten und beschreiben das Vorgehen in komprimierter Form. Vorausgesetzt wird, dass ein Root-Zertifikat / CA-Zertifikat /etc/ssl/certs/ca_test.local.pem mit dem privaten Schlüssel /etc/ssl/private/ca_test.local.key einer eigenen Certificate Authority existiert, mit dem wir selbst signierte Zertikate generieren können.
Wir erstellen unser SAN-Serverzertifikat in drei Schritten.
Zunächst legen wir einen privaten Schlüssel server.test.local.key ohne Verschlüsselung durch eine Passphrase an:

root@server:~# openssl genrsa -out /etc/ssl/private/server.test.local.key 4096

Mit diesem Schlüssel generieren wir dann eine Zertifikatsanfrage server.test.local.csr:

root@server:~# openssl req -config /etc/ssl/openssl-san.cnf -key /etc/ssl/private/server.test.local.key -new -out /etc/ssl/private/server.test.local.csr -sha512 -subj "/CN=server.test.local/O=Theo Test"

Mit der Option -config /etc/ssl/openssl-san.cnf nutzt OpenSSL hierbei die geänderte Konfigurationsdatei.
Abschließend erzeugen wir mit der Zertifikatsanfrage das Serverzertifikat server.test.local.pem:

root@server:~# openssl x509 -CA /etc/ssl/certs/ca_test.local.pem -CAcreateserial -CAkey /etc/ssl/private/ca_test.local.key -days 3650 -extensions v3_req -extfile /etc/ssl/openssl-san.cnf -in /etc/ssl/private/server.test.local.csr -out /etc/ssl/certs/server.test.local.pem -req -sha512
...
Enter pass phrase for /etc/ssl/private/ca_test.local.key: ***

Die Option -extfile verweist auf die Datei mit den Zertifikats-Erweiterungen, in unserem Fall /etc/ssl/openssl-san.cnf. Mit der Option -extensions legen wir den in dieser Datei zu nutzenden Abschnitt mit Erweiterungen fest, hier v3_req.
Die Ausgabe des Serverzertifikats mit

root@server:~# openssl x509 -in /etc/ssl/certs/server.test.local.pem -noout -text

sollte nun die Liste mit den Domainnamen enthalten:

...
X509v3 Subject Alternative Name:
    DNS:test.local, DNS:www.test.local, DNS:mail.test.local
...

Wenn unser SAN-Zertifikat wie gewünscht aussieht, können wir die nicht mehr benötigte Zertifikatsanfrage löschen:

root@server:~# rm /etc/ssl/private/server.test.local.csr