SAN-Zertifikatsrequest mit openssl generieren

…wenn mehr als eine Domain in einem Zertifikat stehen sollen

Hos­tet man auf einem Web­ser­ver meh­re­re vhosts, die über SSL er­reich­bar sein sol­len, hat man drei Mög­lich­kei­ten, dies ein­zu­rich­ten:

  • Sind alle Do­mä­nen Sub­do­mä­nen einer ge­mein­sa­men Do­main, kann man sich mit einem Wild­card-Zer­ti­fi­kat (z.B. *.meinedomain.de für www.​meinedomain.​de, test.​meinedomain.​de, …) be­hel­fen.
  • Hat man nicht die Mög­lich­keit, für den kom­plet­ten Ser­ver ein ein­zel­nes Zer­ti­fi­kat zu ge­ne­rie­ren (z.B. weil die Zer­ti­fi­kats­da­ten von einem Kun­den ge­ne­riert und be­reit­ge­stellt wer­den), kann man sei­nen Web­ser­ver mit SNI kon­fi­gu­rie­ren. Die meis­ten mo­der­nen Brow­ser un­ter­stüt­zen das in­zwi­schen, äl­te­re Win­dows-/IE-Ver­sio­nen sind al­ler­dings ‘raus.
  • Man kon­fi­gu­riert den Ser­ver mit einem ein­zel­nen Zer­ti­fi­kat, das für meh­re­re Do­main-Na­men aus­ge­stellt wird. Dies wird u.a. auch von CA­Cert an­ge­bo­ten – das war mein ak­tu­el­ler Use­ca­se :-)

Wie be­kommt man aber nun meh­re­re Do­main-Na­men mit opens­sl in einen CSR?

„SAN“ steht für „Sub­ject Al­ter­na­ti­ve Name“. Bei ein­fa­chen Zer­ti­fi­ka­ten steht der Do­main­na­me im Com­mon Name (CN). Zu­sätz­li­che Do­mainein­trä­ge lan­den in dem er­wei­ter­ten SAN-Feld.

opens­sl fragt bei der re­gu­lä­ren Er­zeu­gung eines CSR keine Daten für sol­che Ein­trä­ge ab. Die (ein­zi­ge?) Mög­lich­keit, die SAN-Da­ten in den CSR zu be­kom­men, ist ein Con­fig-File. Über das Con­fig­fi­le kann man auch die rest­li­chen be­nö­tig­ten An­ga­ben ein­tra­gen, so läuft opens­sl ohne Be­nut­zer­inter­ak­ti­on durch – für Skrip­te recht prak­tisch.

Das Con­fig-File für CN und SANs sieht fol­gen­der­ma­ß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

An­schlie­ßend ge­ne­riert man den CSR mit­tels

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