SAN-Zertifikatsrequest mit openssl generieren

…wenn mehr als eine Domain in einem Zertifikat stehen sollen

Hostet man auf einem Webserver mehrere vhosts, die über SSL erreichbar sein sollen, hat man drei Möglichkeiten, dies einzurichten:

  • Sind alle Domänen Subdomänen einer gemeinsamen Domain, kann man sich mit einem Wildcard-Zertifikat (z.B. *.meinedomain.de für www.meinedomain.de, test.meinedomain.de, …) behelfen.
  • Hat man nicht die Möglichkeit, für den kompletten Server ein einzelnes Zertifikat zu generieren (z.B. weil die Zertifikatsdaten von einem Kunden generiert und bereitgestellt werden), kann man seinen Webserver mit SNI konfigurieren. Die meisten modernen Browser unterstützen das inzwischen, ältere Windows-/IE-Versionen sind allerdings ‘raus.
  • Man konfiguriert den Server mit einem einzelnen Zertifikat, das für mehrere Domain-Namen ausgestellt wird. Dies wird u.a. auch von CACert angeboten – das war mein aktueller Usecase :-)

Wie bekommt man aber nun mehrere Domain-Namen mit openssl in einen CSR?

„SAN“ steht für „Subject Alternative Name“. Bei einfachen Zertifikaten steht der Domainname im Common Name (CN). Zusätzliche Domaineinträge landen in dem erweiterten SAN-Feld.

openssl fragt bei der regulären Erzeugung eines CSR keine Daten für solche Einträge ab. Die (einzige?) Möglichkeit, die SAN-Daten in den CSR zu bekommen, ist ein Config-File. Über das Configfile kann man auch die restlichen benötigten Angaben eintragen, so läuft openssl ohne Benutzerinteraktion durch – für Skripte recht praktisch.

Das Config-File für CN und SANs sieht folgendermaßen aus:

prompt = no
distinguished_name = req_distinguished_name
req_extensions = req_ext

[req_distinguished_name]
commonName = www.erstedomain.de

[req_ext]
subjectAltName = @alt_names

[alt_names]
DNS.1 = www.zweitedomain.de
DNS.2 = www.nocheinedomain.de

Anschließend generiert man den CSR mittels

openssl req -new -key serverkey.pem -config csr.conf -out mein.csr