/ SSL

SSL-Zertifikate im Batch-Modus erstellen

Als Programmierer ist man ja grundsätzlich faul. Sich wiederholende Aufgaben überlässt man lieber dem Computer. Zumal es ja grundsätzlich interessanter ist, sie dem Computer beizubringen, anstatt sie selber abzuarbeiten. Auch wenn Letzteres viel schneller gehen würde...

In diesem Sinne stand mal wieder die Erneuerung meiner SSL-Zertifikate an. Nun ist dieses Blog nicht nur unter https://blog.macfrog.de/ sondern auch unter https://blog.mcfrog.de/ erreichbar (für die Leute, denen ich nicht zum hundertsten Mal erklären möchte, dass da ein "a" fehlt). Außerdem habe ich noch ein paar andere Domains mit jeweils nahezu gleichen Subdomains. Insgesamt ziemlich stupide Arbeit, für jede Kombination mit

openssl req -new -nodes -newkey rsa:4096 -sha512 -days <Gültigkeit> -out <CSR-Filename> -keyout <Key-Filename>

einen neuen Zertifikatsantrag zu erstellen und dabei jedes Feld

Country Name (2 letter code) [XX]:DE
State or Province Name (full name) []:.
Locality Name (eg, city) [Default City]:.
...

von Hand auszufüllen. Ein Skript musste her.

Voraussetzung war natürlich zunächst einmal, sich die interaktive Tipparbeit zu sparen. Zum Glück gibt es da in openssl req den Schalter -subj, der den Betreff des Zertifikats angibt. Im Prinzip werden die interaktiv abgefragten Angaben nämlich nur in einen String verpackt, den man auch genauso gut per Kommandozeile übergeben kann:

openssl req -subj "/C=DE/CN=www.example.com/emailAddress=hostmaster@example.com" ...

Mehr als die paar Felder Country, Common Name und emailAddress unterstützen die kostenlosen Zertifizierungsstellen meist sowieso nicht, da sich die anderen Angaben nicht automatisch überprüfen lassen.

Das war's aber auch schon fast. Jetzt kommen nur noch ein paar Schleifen drum, und schon generiert ein kleines Skript ohne Zutun sämtliche CSRs für alle Subdomains meiner Domains:

#!/bin/bash
	
declare -a domains=("macfrog.de" "mcfrog.de")
declare -a subdomains=("blog" "www")
	
for d in "${domains[@]}" ; do
  for s in "${subdomains[@]}" ; do
    echo '***'
    echo '***' $s.$d
    echo '***'
    openssl req -subj "/C=DE/CN=$s.$d/emailAddress=hostmaster@$d" -nodes -new -newkey rsa:4096 -sha512 -days 395 -out $s.$d.csr.pem -keyout $s.$d.key.pem
  done
done