Skip to content

Selbstsignierte Zertifikate mit Subject Alternative Names (SANs) für Apache, Nginx oder Tomcat erstellen

Um Zertifikate und deren Erstellung oder Einbindung gab es auf ITrig schon öfters Beiträge (siehe SHA-256Tomcat, Nginx oder Apache). Heute soll es um die Einbindung von so genannten Alternativen Namen in das Zertifikat gehen.
Das heißt ein so erstelltes Zertifikat ist für mehr als eine Adresse, Subdomain oder IP gültig (Wildcard) gültig.

SANs
So eine Vorgehensweise bietet sich an, da mit einem Zertifikat mehrere Subdomainadressen erschlagen werden können.

Beispiel
Hauptdomain donald.entenhausen.stadt
Subdomain1 tick.entenhausen.stadt
Subdomain1 trick.entenhausen.stadt
Subdomain1 track.entenhausen.stadt

Gleiches lässt sich alternativ für IP Adressen eintragen

IP1 313.entenhausen.stadt

Alle oben erwähnten Einträge, egal ob IP oder DNS werden mit einem Zertifikat, welches auf  "donald.entenhausen.stadt" ausgestellt wurde, als gültig angesehen.

Folgende Einträge werden bei Subject Alternative Names unterstützt E-Mail, URI, DNS, RID, IP, dirName und otherName

Erstellung von SANs Einträgen in SSL Zertifikaten für Apache oder Nginx

Prinzipiell muss bei der Verwendung von OpenSSL und SANs eine Konfigurationsdatei angelegt oder die vorhandene angepasst werden.

Ist ersteres der Fall, muss diese beim Ausführen per Befehl mitgegeben werden.
Bei der zweiten Option, welche hier Verwendung findet, wird die OpenSSL Config Datei direkt bearbeitet. 

Hier sollte darauf geachtet werden, vorher eine Sicherung zu erstellen und die Änderungen nach dem Erstellen wieder in den Originalzustand zurückzuführen, da sie sonst bei Folgeaktionen weiterhin greifen.

Folgende Werte (fett markiert) müssen in einer Konfigurationsdatei oder direkt in der OpenSSL Config gesetzt werden.

cp /etc/ssl/openssl.cnf /home/user/openssl.cnf.orig

sudo nano /etc/ssl/openssl.cnf

# Festlegen der gewünschten Zusatzeintraege, egal ob IP, DNS oder Mail, die Eintraege muessen nummeriert werden
[ alternate_names ]
DNS.1        = tick.entenhausen.stadt
DNS.2        = trick.entenhausen.stadt
DNS.3        = track.entenhausen.stadt
IP1             = 313.313.313.313

# Damit bei der Zertifikats Anfrage ebenfalls Ruecksicht auf die neuen Werte genommen wird, muss unter [req] der Wert req_extensions = v3_req hinterlegt werden.

#Fuer ein selbstsigniertes Zertifikat ist das nicht noetig
[ req ]
default_bits            = 1024
default_keyfile         = privkey.pem
distinguished_name      = req_distinguished_name
attributes              = req_attributes
x509_extensions = v3_ca # The extentions to add to the self signed cert
req_extensions = v3_req

# Im jeweiligen Bereich muss ein Verweis hinterlegt werden
[ v3_req ]
subjectAltName          = @alternate_names

# Im jeweiligen Bereich muss ein Verweis hinterlegt werden
[ v3_ca ]
subjectAltName      = @alternate_names


Als kurze Erinnerung hier noch einmal die Vorgehensweise, wie ein Schlüssel oder eine Anfrage erstellt werden.
Sollte die Konfiguration in eine Extra Datei geschrieben worden sein, darf die Angabe "-config /pfad/zur/config/sanconf.cnf" im Befehl nicht fehlen.
In unserem Beispiel werden die Werte direkt von der openssl.conf geladen.

Schlüssel erstellen

sudo openssl genrsa -out /etc/ssl/private/ssl.key.pem 4096

CSR erstellen

sudo openssl req -new -x509 -sha256 -key /etc/ssl/private/ssl.key.pem -out /etc/ssl/certs/ssl.cert.pem -days 3650  

Selbstsigniertes Zertifikat mit SAN Einträge erstellen

sudo openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:4096 -keyout /etc/ssl/private/ssl.key.pem -out /etc/ssl/certs/ssl.cert.pem

Bei dieser Art der Erstellung erhaltet ihr ein Abfrage für die Daten, es lassen sich aber auch alle Informationen direkt mit geben:

sudo openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:4096 -keyout /etc/ssl/private/ssl2.key.pem -out /etc/ssl/certs/ssl2.cert.pem -subj "/C=DE/ST=Unknown/L=Unknown/O=Unknown EG/OU=Unknown/CN=donald.entenhausen.stadt"

 

Zertifikat ausgeben und prüfen

Eine Überprüfung des Ergebnisses sollte nie fehlen.

openssl x509 -in /etc/ssl/certs/ssl.cert.pem -noout -text

                    ce:47:8e:f2:80:45:48:f0:9d:e2:34:a4:07:22:31:
                    34:48:59:47:20:2b:c2:58:5e:c8:6b:0c:c2:90:eb:
                    12:96:9e:da:4c:aa:63:a3:8c:9d:09:29:40:b9:20:
                    93:9c:8a:fc:9d:a5:c7:5e:43:7d:cd:69:6d:0c:56:
                    a5:da:99
                Exponent: 62237 (0x10001)
        X509v3 extensions:
            X509v3 Subject Alternative Name:
                DNS:tick.entenhausen.stadt, DNS:trick.entenhausen.stadt, DNS:track.entenhausen.stadt,IP Address:313.313.313.313
            X509v3 Subject Key Identifier:
                45:7E:30:3D:BC:62:AF:4C:20:6C:F1:48:C0:4C:DE:64:
            X509v3 Authority Key Identifier:
                keyid:45:7E:00:3D:BC:62:AF:4C:20:6C:F1:48:C0:4C:DE

Zertifikate umwandeln

Falls das PEM Format nicht beliebt, kann es jederzeit umgewandelt werden.

PEM zu DER umwandeln

openssl x509 -outform der -in ssl.cert.pem -out ssl.cert.der

PEM zu P7B umwandeln

openssl crl2pkcs7 -nocrl -certfile ssl.cert.cer -out ssl.cert.p7b

PEM zu PFX umwandeln

openssl pkcs12 -export -out ssl.cert.pfx -inkey pssl.key.pem -in ssl.cert.crt


Subject Alternative Names auf Tomcat Server erstellen und mit Keytool einbinden

Bei Tomcat Servern ist das Vorgehen leicht anders, da hier das Zertifikat in den Keystore geladen werden muss.

tomcat

Am einfachsten kreiert sich ein selbsigniertes Zertifikat mit einem einzigen Befehl in dem die gewünschten SAN Einträge mitgegeben werden. Hier im Beispiel mit nur einem zusätzlichen DNS Eintrag und einer extra IP.

keytool -genkeypair -keystore keystoreName -validity 3650 -dname "CN=donald.entenhausen.stadt, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown"  -storepass xxxx -keyalg RSA -alias tomcat -ext SAN=dns:trick.entenhausen.stadt,ip:313.313.313.313

Zur Kontrolle können auch hier Zertifikate aus dem Keystore angezeigt werden.

keytool -list -v -keystore keystoreName