Funkenstrahlen Podcasting, Netzpolitik, App-Entwicklung

Let's Encrypt auf Uberspace

Anfang letzten Jahres habe ich für meine Domains TLS aktiviert. Die Generierung der nötigen Zertifikate war damals wirklich nicht einfach. Es gab damals schon Aussicht auf Besserung: Mit Let’s Encrypt sollte alles besser werden.

Nun ist Let’s Encrypt endlich da und auch bei den Ubernauten verfügbar. Ich habe heute ein paar freie Minuten genutzt und meine Zertifikate auf Let’s Encrypt umgestellt. Das war wirklich sehr einfach und ich kann nur jedem empfehlen das auch zu tun!

Vorbereitungen

Zunächst wird die Konfigurationsdatei erstellt:

[julia@amnesia ~]$ uberspace-letsencrypt 

We have now created the following config file for you:

  /home/julia/.config/letsencrypt/cli.ini

Please review especially the domain list we have generated for you
and adapt the 'domains' setting if you want to make some changes:

  www.domain1.tld
  domain1.tld
  domain2.tld

When you're done you can use the official Let's Encrypt client by executing:

  letsencrypt certonly

You can safely ignore all 'Root (sudo) is required to run most of letsencrypt functionality' warnings.

Ihr solltet dann noch einmal einen kurzen Blick in die Konfiguration /home/julia/.config/letsencrypt/cli.ini werfen, ob auch alle Angaben korrekt sind.

Zertifikate generieren

Mit einem einzigen Befehl lassen sich nun die Zertifikate generieren:

[julia@amnesia ~]$ letsencrypt certonly
[...]
IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through e-mails sent to julia@amnesia.uberspace.de.
 - Congratulations! Your certificate and chain have been saved at /home/julia/.config/letsencrypt/live/www.domain1.tld/fullchain.pem.
   Your cert will expire on 2016-03-03. To obtain a new version of the certificate in the future, simply run Let's Encrypt again.
 - Your account credentials have been saved in your Let's Encrypt configuration directory at /home/julia/.config/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Let's Encrypt so making regular backups of this folder is ideal.

Die Zertifikate liegen nun in ~/.config/letsencrypt/live/.

Aufschalten

Nun gilt es noch die Zertifikate im Webserver zu aktivieren. Das geht auch wieder mit einem einzigen Befehl:

 [julia@amnesia ~]$ uberspace-prepare-certificate -k ~/.config/letsencrypt/live/www.domain1.tld/privkey.pem -c ~/.config/letsencrypt/live/www.domain1.tld/cert.pem
🔑  Found key... 
📝  Found certificate...
🔑  Key seems valid, moving on...
📝  Certificate seems valid, moving on... (step by step)
🔐  Certificate matches key, moving on... (we're getting there!)
📜  Magically getting intermediate certificate(s) if there are any needed... (hold on tight)
🔐  Checking for www.domain1.tld.
🌍  temporary webserver started...
✅  certificate is valid.
🌍  killed temporary webserver...
🚀  All good! Your new certificate will be live within the next five minutes.

Lasst euch nicht irritieren, dass ihr nur ein Zertifikat generiert bekommt und nur ein Zertifikat aufschalten müsst, auch wenn ihr mehrere Domains in der Konfiguration angegeben habt. Das eine Zertifikat gilt automatisch für alle eure Domains (die ihr in der cli.ini angegeben habt).

Nach kurzer Zeit ist euer Zertifikat dann aktiv:

Wie im alten TLS Blogpost beschrieben, könnt ihr nun noch alle User auf https weiterleiten und HSTS aktivieren, falls ihr das noch nicht getan habt.

Automatisch erneuern

Zertifikate von Let’s Encrypt sind nur 90 Tage gültig. Das heißt ihr müsst regelmäßig daran denken die Zertifikate zu erneuern.

Ich habe mir dafür ein kleines Skript in ~/scripts/letsencrypt-renew-certificates angelegt. Einfach noch einmal letsencrypt certonly aufrufen, um neue Zertifikate zu generieren. uberspace-add-certificate bringt dann die neuen Zertifikate direkt zum Einsatz.

#! /bin/bash

PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
domain=funkenstrahlen.de

# sleep for a random time so not all certificates get renewed at the same time
sleep $(expr $RANDOM % 600)
cd ~

# check if the certificate is valid for more than 10 days
openssl x509 -checkend $(( 10 * 86400 )) -in ~/.config/letsencrypt/live/${domain}/cert.pem > /dev/null

# if not request a new one
if [ $? != 0 ]; then
        letsencrypt certonly
        uberspace-add-certificate -k ~/.config/letsencrypt/live/${domain}/privkey.pem -c ~/.config/letsencrypt/live/${domain}/cert.pem
fi

Dieses Skript lasse ich nun jede Woche als Cronjob laufen. Dazu habe ich folgende Zeile mit crontab -e eingefügt:

@weekly /home/i42n/scripts/letsencrypt-renew-certificates

Damit das als Cronjob ohne User Interaktion ablaufen kann, muss man in .config/letsencrypt/cli.ini noch ein paar Optionen setzen:

# To prevent being forced to agree manually to the terms
agree-tos = True

# Automatically renew the certificate
renew-by-default = True

Natürlich nicht vergessen:

chmod +x letsencrypt-renew-certificates