Einleitung

Let's Encrypt die frei CA. Ich werde mich nicht weiter über die Organisation auslassen. Wer Interesse hat kann sich hier genauer informieren.

Aufbau

Ich habe mich dafür entschieden für jede Subdomain ein eigenes Zertifikat zu beantragen. Es gibt auch die Möglichkeit ein einziges Zertifikat zu beantragen das dann für alle Subdomains gültig ist.

Hinweise

Zum testen sollt man die Option --test-cert verwenden, da man sonnst sehr schnell in die Limits fällt. Man kann nur maximal 5 Zertifikate für eine Domain alle 8 Tag beantragen, und beim testen kommt man sehr schnell darüber. Mit der Option werden dann die Zertifikate nicht gültig unterschrieben, was aber zum testen reicht.

Aufbau

Da die Zertifikate immer nur 90 Tage gültig sind müssen sie öfter erneuert werden. Da die Automatisierung eine der Vorzüge von Let's Encrypt sein soll, habe ich hier mal meine Lösung:

Da es noch kein automatischen Prozess für Nginx gibt, wird der let's encrypt client im webroot Modus verwendet.
Die Installationsanleitung für den Client findet ihr auf der Let's Encrypt Seite.

Die Nginx Konfig anpassen:

folgendes braucht ihr in der config vom Nginx um die Zertifikate zu beantragen. Entweder in einem allgemeingültigen Abschnitt, der immer aufgerufen wird. Oder ihr setzt das in jede Server config die ihr habt. Denkt daran das ihr die Ordner im root Pfad erstellt.

location '/.well-known/acme-challenge'
    {
            default_type "text/plain";
            root        /tmp/letsencrypt-auto;
    }

Nun das Bash Script was die Zertifikate für euch erneuert. Ihr könnt es z.B. unter /usr/sbin speichern als le-renew. Im Script fügt ihr nur noch eure Daten ein. Wenn noch kein Zertifikat angefordert wurde für die Domain, sollte das das Script erledigen.
Da ihr nur 5 Zertifikate alle 8 Tage beantragen könnt, kann es durchaus einige Zeit dauern bis ihr alle Zertifikate zusammen habt.

#!/bin/bash

keysize='4096'
email='postmaster@example.org'
domainss='xs.example.org'
webroot='/tmp/letsencrypt-auto'
web_service='nginx'
exp_limit=30;
le_path='/srv/letsencrypt/letsencrypt'

if [ ! -f $config_file ]; then
    echo "[ERROR] config file does not exist: $config_file"
    exit 1;
fi

IFS=', ' read -r -a domains <<< "$domainss"

for domain in "${domains[@]}"
do
cert_file="/etc/letsencrypt/live/$domain/fullchain.pem"
    if [ ! -f $cert_file ]; then
            echo "[ERROR] certificate file not found for domain $domain. Get new one for this domain."
            $le_path/letsencrypt-auto certonly -a webroot --email $email --agree-tos --rsa-key-size $keysize --renew-by-default -w $webroot -d $domain
            /usr/sbin/service $web_service reload
    else

            exp=$(date -d "`openssl x509 -in $cert_file -text -noout|grep "Not After"|cut -c 25-`" +%s)
            datenow=$(date -d "now" +%s)
            days_exp=$(echo \( $exp - $datenow \) / 86400 |bc)
            echo "Checking expiration date for $domain..."
            if [ "$days_exp" -gt "$exp_limit" ] ; then
                    echo "The certificate is up to date, no need for renewal ($days_exp days left)."
            else
                    echo "The certificate for $domain is about to expire soon. Starting webroot renewal script..."
                    mkdir -p $webroot
                    $le_path/letsencrypt-auto certonly -a webroot --email $email --agree-tos --rsa-key-size $keysize --renew-by-default -w $webroot -d $domain
                    echo "Reloading $web_service"
                    /usr/sbin/service $web_service reload
                    echo "Renewal process finished for domain $domain"
            fi
    fi

done

Wenn ihr Anregungen habt mailt mir und ansonsten viel Spaß am Gerät :-)

Logo von Letsencrypt unter CC BY-NC 4.0