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 dannletsencrypt 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 ...
unduberspace-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
🔑 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.
Und das war’s schon.
Das Zertifikat ist für alle Domains gültig, die in der /home/julia/.config/letsencrypt/cli.ini
angegeben werden (im Zweifelsfall also alle aufgeschalteten); das Prozedere muss also nicht pro Domain, sondern pro Account durchlaufen werden und ist damit maximal unkompliziert.
Wie bereits erwähnt, ist das Zertifikat nur für 90 Tage gültig. Wir gehen noch mal in uns und überlegen, wie wir diesen Schritt am sinnvollsten automatisieren können. Aktuell müsst ihr also noch von Hand vorgehen:
[julia@amnesia ~]$ letsencrypt-renewer --config-dir ~/.config/letsencrypt --logs-dir ~/.config/letsencrypt/logs --work-dir ~/tmp/
2015-12-04 10:55:18,709:DEBUG:letsencrypt.cli:Root logging level set at 30
2015-12-04 10:55:18,711:INFO:letsencrypt.cli:Saving debug log to /home/julia/.config/letsencrypt/logs/renewer.log
Processing www.domain1.tld.conf
… und dann das Zertifikat, was dort herausfällt, erneut importieren. Wir überschreiben dabei das bereits vorhandene und updaten die Konfiguration in unserem HTTPS-Frontend. Da die Pfade die gleichen sind (und wie ja weiter oben beschrieben, Symlinks sind), ist der Befehl zum importieren der gleiche:
[julia@amnesia ~]$ uberspace-prepare-certificate -k ~/.config/letsencrypt/live/www.domain1.tld/privkey.pem -c ~/.config/letsencrypt/live/www.domain1.tld/cert.pem
Let’s Encrypt!
So, da der tl;dr-Teil hier zuende ist, sehen wir von euch gerade vermutlich nur noch eine Staubwolke, weil ihr’s erstmal unbedingt jetzt sofort auf euren Accounts ausprobieren wollt. Verstehen wir. Nur zu. Wir warten hier solange und fahren dann später, wenn wir ein bisschen Wochenende gehabt haben, sicher mit ein paar Erläuterungen zu unserer Implementierung fort.