/ crypto

Let's Encrypt rollt an - auch bei uns

Achtung! Dieser Blogpost ist die Ankündigung unseres Let's Encrypt-Supports. Leider haben sich seitdem einige Details wie z.B. der lesencrypt-renewer geändert, sodass die Informationen hier nicht mehr sonderlich aktuell sind. Stattdessen bitten wir dich, einen Blick auf den zugehörigen Wiki-Artikel zu werfen, welchen wir stets auf dem neuesten Stand halten.

Das Wichtigste in Kürze.

Let's Encrypt?

Für alle, die in den letzten Wochen unter einem Stein gelebt haben: Let's Encrypt ist eine Initiative, die kostenlos und automatisiert Zertifikate ausstellt, die z.B. für HTTPS nutzbar sind.

  • Bitte atmet einmal kurz durch und führt euch nochmal vor Augen, dass Let's Encrypt am gestrigen 3. Dezember nicht "gestartet" ist, sondern lediglich in eine Public-Beta-Phase eingetreten ist. Das heißt, Dinge werden klemmen, sich unerwartet verhalten oder kaputtgehen - bei Let's Encrypt selbst oder bei uns; höchstwahrscheinlich auf beiden Seiten. Stellt euch drauf ein, dass alles, was jetzt kommt, noch Ecken und Kanten haben wird.
  • Habt Geduld. Let's Encrypt meldet bereits wenige Minuten nach dem ersten Release unserer Anbindung "Too many registrations from this IP" - weil's ja eben schon durchaus eine ganze Reihe von Usern aus jedem unserer Host ist. Dagegen können wir nichts tun; wir gehen davon aus, dass Let's Encrypt sein Angebot im Rahmen der Public Beta eben langsam hochfahren will und solche Schwellwerte vermutlich im Lauf der Zeit lockern wird. Versucht es einfach später nochmal - und damit meinen wir "einige Stunden" und nicht "richte dir einen Cronjob ein, der es minütlich versucht". Bittedankeschön.
  • Wir supporten Let's Encrypt ausschließlich auf unseren CentOS-6-Hosts, da wir auch nur dort den automatisierten Zertifikatsimport anbieten, und ohne jenen ergibt der Einsatz von Let's Encrypt wenig Sinn, weil deren Zertifikate nur 90 Tage gültig sind.
  • Der offizielle letsencrypt-Client ist auf alle CentOS-6-Hosts verteilt, derzeit in der Version 0.0.0dev20151201. Er meckert halt gern (und in rot), dass er ohne sudo-Rechte kaum sinnvoll nutzbar sei (hart im Code untergebracht, wenn uid != 0), aber das ist Quark; ignoriert das.
  • Wir haben ein Tool namens uberspace-letsencrypt gebaut, das euch eine möglichst sinnvolle ~/.config/letsencrypt/cli.ini anlegt und dort alle Hostnamen aufführt, für die ihr vermutlich gleich Zertifikate beziehen wollt. In der Folge könnt ihr dann letsencrypt certonly ausführen, wie's im Lehrbuch steht, und mit ein bisschen Glück klappt dann alles.
  • Wenn in der offiziellen Dokumentation von /etc/letsencrypt die Rede ist, müsst ihr das für euch in ~/.config/letsencrypt übersetzen. Eure Zertifikate werden also in ~/.config/letsencrypt/live/<common_name>/ abgelegt.
  • Ihr könnt unser (von Let's Encrypt unabhängiges) Tool uberspace-prepare-certificate benutzen, um so erstellte Zertifikate automatisch zu importieren.
  • Ein automatisches Renewal wird aufgrund der kurzen Laufzeiten der Zertifikate noch ein Thema werden, ist aber für den Ad-hoc-Start noch nicht drin; auch, weil wir erstmal abwarten wollen, wie sich alles so stabilisiert. Für Bastelwütige: Im Moment sollte eine Kombi aus letsencrypt-renewer ... und uberspace-prepare-certificate ... als monatlicher Cron- oder runwhen-Job als Übergangslösung taugen.

Beispiel

Butter bei die Fische. Die Liste der Hostnamen, die letsencrypt gleich zertifizieren soll, extrahiert uberspace-letsencrypt aus den auf den Uberspace aufgeschalteten Domains. Wildcards (*.domain.tld) sind dabei ein gewisses Problem, weil Let's Encrypt keine Wildcards unterstützt. Wir gehen daher so vor, dass wir dann schauen, ob es in /var/www/virtual/$USER Verzeichnisse gibt, deren Hostname zum Wildcard passt, und nehmen jene in die Liste mit auf; falls nicht, nehmen wir www als höchstwahrscheinlich gewünschten Wert an. Weiter geht's:

[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.

Bitte schau, ob die Liste der Hostnamen, die uberspace-letsencrypt für dich orakelt hat, deinen Vorstellungen entspricht. Du kannst die Liste in der darüber genannten cli.ini problemlos anpassen. letsencrypt wird den ersten Hostnamen der Liste als Common Name des Zertifikats verwenden und alle anderen als Subject Alternative Names im Zertifikat eintragen.

[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.

Wenn also alles geklappt hat, wurden euch ein Key und ein Zertifikat generiert und in folgendem Ordner abgelegt...

[julia@amnesia ~]$ ls -la ~/.config/letsencrypt/live/www.domain1.tld/
total 8
drwxr-xr-x 2 julia julia 4096 Dec  4 10:01 .
drwx------ 3 julia julia 4096 Dec  4 10:01 ..
lrwxrwxrwx 1 julia julia   37 Dec  4 10:01 cert.pem -> ../../archive/www.domain1.tld/cert1.pem
lrwxrwxrwx 1 julia julia   38 Dec  4 10:01 chain.pem -> ../../archive/www.domain1.tld/chain1.pem
lrwxrwxrwx 1 julia julia   42 Dec  4 10:01 fullchain.pem -> ../../archive/www.domain1.tld/fullchain1.pem
lrwxrwxrwx 1 julia julia   40 Dec  4 10:01 privkey.pem -> ../../archive/www.domain1.tld/privkey1.pem

... und können wie gewohnt per uberspace-prepare-certificate importiert werden:

[julia@amnesia ~]$ uberspace-prepare-certificate -k ~/.config/letsencrypt/live/www.domain1.tld/privkey.pem -c ~/.config/letsencrypt/live/www.domain1.tld/cert.pem