openssl: CSR für ein SSL-Server-Zertifikat mit mehreren Host-Namen erzeugen

Um ein SSL-Server-Zertifikat auf einem Server unter mehreren Host-Namen einsetzen zu können, muss das Zertifikat alle diese Host-Namen als sogenannte alternative Namen (SubjectAlternativeName, SAN) enthalten. Häufig davon betroffen sind Zertifikate für die Haupt-Web-Präsenz einer Einrichtung, die sowohl unter dem Host-Namen mit dem traditionellen www im Host-Namen als auch einfach unter der „blanken“ Haupt-Domain zu erreichen ist, z. B. unter www.example.org und example.org. Entsprechende Zertifikatanträge benötigen daher am besten einen Certificate Signing Request (CSR), der schon alle benötigten alternativen Namen enthält. Wird zum Erzeugen des CSRs das Kommandozeilenwerkzeug openssl genutzt, so sind diese Art von CSRs nur mit einer speziellen openssl-Konfigurationsdatei zu erzeugen.

Unten eine Beispielkonfigurationsdatei für openssl, deren Aufruf mit dem angegebenen Kommando sowohl das Schlüsselmaterial als auch den CSR mit dem angegebenen SubjectDN und den alternativen Namen erzeugt:

#
# Filename: openssl-www.example.org.conf
#
# Sample openssl configuration file to generate a key pair and a PKCS#10 CSR
# with included requested SubjectAlternativeNames (SANs)
#
# Sample openssl commandline command:
#
# openssl req -config ./openssl-www.example.org.conf -new -keyout www.example.org-key.pem -out www.example.org-csr.pem
#
# To remove the passphrase from the private key file use
#
# openssl rsa -in www.example.org-key.pem -out www.example.org-key.pem
#
# This eases automatic startup of the SSL/TLS-server when restarted or
# rebooted. Check for secure file access permissions on the private key file.
# Do not transfer the private key unencrypted over network connections.
#
# If generated directly on a secure filesystem with proper secure file access
# permissions on the server system add option -nodes to omit setting the
# secret key's passphrase protection - this eases automatic startup of the
# SSL/TLS-server when restarted or rebooted.
#
# To set an AES256 passphrase on the private key file use
#
# openssl rsa -aes256 -in www.example.org-key.pem -out www.example.org-key.pem
#

RANDFILE=/dev/urandom

[ req ]
default_bits       = 4096 # key length 4096 bits RSA
distinguished_name = req_distinguished_name
req_extensions     = req_cert_extensions
default_md         = sha256
dirstring_type     = nombstr
prompt             = no

[ req_distinguished_name ]

# requested SubjectDN
#
C   = DE
ST  = Bundesland
L   = Stadt
O   = Einrichtung
1.OU= Abteilung
2.OU= Team
CN  = www.example.org

[req_cert_extensions]

subjectAltName=@subject_alt_name

[ subject_alt_name ]

# requested SubjectAlternativeNames (SANs)
#
# SANs of type DNS
# change those FQDNs to real FQDNs in domains registered to your organisation
#
DNS.1=www.example.org
DNS.2=example.org
DNS.3=www.example.net
DNS.4=example.net

# SANs of type IP
# IP#s are normally not needed in certificates
# change those RFC 1918 IP#s to real IP#s assigned to your organisation
#
#IP.1=10.11.12.13
#IP.2=192.168.2.42

Ein äquivalenter Einzeiler für die Linux-Kommandozeile ist:

#> openssl req -newkey rsa:4096 -sha256 -keyout www.example.org-key.pem -out www.example.org-csr.pem -batch -subj "/C=DE/ST=Bundesland/L=Stadt/O=Einrichtung/OU=Abteilung/OU=Team/CN=www.example.org" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:www.example.org,DNS:example.org,DNS:www.example.net,DNS:example.net"))

Beispielangaben für den SubjectDN, die Host-Namen und ggf. IP-Adressen sind natürlich an die lokalen Gegebenheiten anzupassen.

(rkm, 01.12.2015)