TLS-Zertifikate von LetsEncrypt nutze ich seit der „Closed Beta“ (2015). Von Anfang an hatte ich dafür das damals promotete Python-Script Certbot benutzt.

Das ist aber nicht unbedingt schön, da es viele Abhängigkeiten nachinstalliert und sich eine eigene Python-Umgebung zurecht bastelt.

Daher steht seit längerem auf meiner Todo-Liste, ein möglichst einfaches Shell-Script für die Nutzung der LetsEncrypt-Zertifikate zu verwenden. Heute habe ich das auf einem meiner Server eingerichtet und es soll hier dokumentiert werden.

Verwendet habe ich das Shell-Script acme.sh.

Dies ist kein Howto, wie man LetsEncrypt nutzt; ich gehe davon aus, dass man Webserver usw. bereits darauf eingerichtet hat. Hier geht es nur darum, wie man acme.sh installiert und verwendet.

Installation#

Alle Befehle werden als root ausgeführt.

apt-get install socat git
git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
./acme.sh --install \
--home /root/.acme.sh \
--certhome /etc/acme/certs \
--accountemail "mail@bladomain.tld" \
--nocron

Auf die angegebene E-Mail-Adresse erhält man vor Ablauf eines Zertifikats entsprechende Erinnerungen.

Jetzt kann man das Verzeichnis acme.sh löschen. Das installierte Script hat selbst einen Update-Mechanismus.

Ausloggen und wieder einloggen, damit das Alias nutzbar wird.

Neue(s) Zertifikat(e) beantragen#

Wieder alles als root ausführen.

Man muss den Webserver beenden, damit der entsprechende Port vom Standalone-Server (socat) genutzt werden kann.

systemctl stop apache2
acme.sh --tls --issue -d mumble.natenom.com -d m.natenom.com

Die Ausgabe sieht so aus:

[Fri Nov 10 03:56:59 CET 2017] Standalone tls mode.
[...]
[Fri Nov 10 03:57:00 CET 2017] Registering account
[Fri Nov 10 03:57:02 CET 2017] Registered
[Fri Nov 10 03:57:03 CET 2017] Update account tos info success.
[Fri Nov 10 03:57:03 CET 2017] ACCOUNT_THUMBPRINT='xxxxxxxxxxxxxxxxxxxxxxxx'
[Fri Nov 10 03:57:03 CET 2017] Creating domain key
[Fri Nov 10 03:57:04 CET 2017] The domain key is here: /etc/acme/certs/mumble.natenom.com/mumble.natenom.com.key
[Fri Nov 10 03:57:04 CET 2017] Multi domain='DNS:mumble.natenom.com,DNS:m.natenom.com'
[Fri Nov 10 03:57:04 CET 2017] Getting domain auth token for each domain
[Fri Nov 10 03:57:04 CET 2017] Getting webroot for domain='mumble.natenom.com'
[Fri Nov 10 03:57:04 CET 2017] Getting new-authz for domain='mumble.natenom.com'
[Fri Nov 10 03:57:05 CET 2017] The new-authz request is ok.
[...]
[Fri Nov 10 03:57:11 CET 2017] Verifying:mumble.natenom.com
[Fri Nov 10 03:57:11 CET 2017] Starting tls server.
[Fri Nov 10 03:57:11 CET 2017] Multi domain='DNS:xxxxxxxxxxxx.acme.invalid'
[Fri Nov 10 03:57:16 CET 2017] Success
/root/.acme.sh/acme.sh: line 3589: 20206 Terminated $__S_OPENSSL > /dev/null 2>&1
[...]
[Fri Nov 10 03:57:48 CET 2017] Verify finished, start to sign.
[Fri Nov 10 03:57:49 CET 2017] Cert success.
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
[Fri Nov 10 03:57:49 CET 2017] Your cert is in /etc/acme/certs/mumble.natenom.com/mumble.natenom.com.cer
[Fri Nov 10 03:57:49 CET 2017] Your cert key is in /etc/acme/certs/mumble.natenom.com/mumble.natenom.com.key
[Fri Nov 10 03:57:49 CET 2017] The intermediate CA cert is in /etc/acme/certs/mumble.natenom.com/ca.cer
[Fri Nov 10 03:57:50 CET 2017] And the full chain certs is there: /etc/acme/certs/mumble.natenom.com/fullchain.cer
systemctl start apache2

Die Zertifikat relevanten Dateien sind danach im Verzeichnis /etc/acme/certs zu finden und in den entsprechenden Konfigurationsdateien z. B. des Webservers kann darauf verwiesen werden.

Zertifikat(e) erneuern#

Eine Liste aller Zertifikate erhält man mit:

acme.sh --list

Und erneuern kann man mit:

systemctl stop apache2
acme.sh --tls --renew-all

# Oder nur bestimmte Certs erneuern
# acme.sh --tls --renew -d mumble.natenom.com -d m.natenom.com

systemctl start apache2

Ohne root-Rechte, fast#

Mit etwas mehr Aufwand kann man das ganze auch noch ohne root-Rechte nutzen, zumindest alles bis auf den Standalone-Server. Denn nur root darf auf Ports ≤1023 lauschen.

Damit werde ich mich vielleicht später noch beschäftigen; insgesamt ist acme.sh aber auch mit root-Rechten wesentlich schöner als das alte Python-Script.

Cron/Systemd timer#

Hilfe#

Für alles weitere siehe:

acme.sh --help