Das neue ACME v2 Protokoll für Let's Encrypt Zertifikate ist live! Dies erlaubt unter anderem nun Wildcard-Zertifikate zu beziehen. Damit können viele einzelne Zertifikate (wie z.B. subdomains) auf eines reduziert werden und für weitere Subdomains benötigt es kein zusätzliches Zertifikat.

Soche Universalzertifikate möchte ich natürlich gleich bei mir einsetzen, jedoch kann der von mir benutzen acme-client das neue ACME 2.0 Protokoll noch nicht und wird es in naher Zukunft auch nicht können.
Bisher nutze ich den in der Golang geschriebenen ACME-Client von hlandau, welcher mir bis heute gute Dienste erwiesen hat. Es ist nur ein einziges GO-binary welches für die Zertifikatsverwaltung benötigt wird und unterstützt ein breites Spektrum von Konfigurationen. Im Gegensatz zu anderen Clients benötigt dieser nicht ein riesigen Haufen von Modulen wie z.B. der in Python geschriebenen certbot.

Nach meiner Suche für einen v2 kompatiblen, einfachen ACME-Client, habe ich mich für acme.sh entschieden. Er unterstützt das neue Protokoll ACME 2.0 und dessen *-Zertifikate. Weiter kann dieser Client das Challenge über nsupdate im DNS-Server hinterlegen. Dies kommt mir sehr entgegen, da ich die Zertifikate meiner Domains schon jetzt mit dem DNS-01 Verfahren beziehe.
Die Migration ist sehr einfach, ich löse einfach die neuen Zertifikate mit dem acme.sh und nutze diese in meinen Services.

Installation von acme.sh

Die Installation ist sehr einfach und im README von acme.sh auch gut beschrieben.

# als root
curl https://get.acme.sh | sh

Für die regelmässige und automatische Erneuerung der Zertifikate lege ich einen Cronjob an:

0 6 * * * root /root/.acme.sh/acme.sh --cron --home "/root/.acme.sh" > /dev/null

Um ein Wildcardzertifikat zu lösen benötigt es eine Schnittstelle zum DNS-Server, damit das Challenge dort hinterlegt, und durch Letsencrypt überprüft werden kann. Nur durch diese Verifikation kann das spezielle Zertifikat für mehrere Subdomains bezogen werden. Dazu verwende ich nsupdate, ein Utility für den dynamischen DNS update.

acme.sh dnsapi

Voraussetzung ist ein für nsupdate konfigurierter DNS-Server

export NSUPDATE_SERVER="mockingjay.sandchaschte.ch"
export NSUPDATE_KEY="/root/.acme.sh/update.key"

Ich lege den nsupdate key am definierten Ort ab: /root/.acme.sh/update.key

key "_acme-challenge" {
    algorithm hmac-sha512;
    secret "notmyrealsecret";
};

Zertifikate erstellen und installieren

Nun kann ich mit dem acme.sh die Zertifikate ausstellen lassen. Dabei wähle ich folgende Optionen:

  • --issue: Zertifikat erstellen
  • --dns dns_nsupdate: Das DNS-Challenge mit nsupdate verwenden
  • -d sandchaschte.ch -d *.sandchaschte.ch: meine Domain für welche ich das Wildcardzertifikat ausstellen möchte
  • --dnssleep 10: Warte nur 10 Sekunden nach dem Eintrag in den DNS mit nsupdate, bevor das Challenge überprüft wird
acme.sh --issue --dns dns_nsupdate -d sandchaschte.ch -d *.sandchaschte.ch --dnssleep 10

Ergebnis:

[Don Mär 15 20:17:42 CET 2018] Creating domain key
[Don Mär 15 20:17:42 CET 2018] The domain key is here: /root/.acme.sh/sandchaschte.ch/sandchaschte.ch.key
[Don Mär 15 20:17:42 CET 2018] Multi domain='DNS:sandchaschte.ch,DNS:*.sandchaschte.ch'
[Don Mär 15 20:17:42 CET 2018] Getting domain auth token for each domain
[Don Mär 15 20:17:44 CET 2018] Getting webroot for domain='sandchaschte.ch'
[Don Mär 15 20:17:44 CET 2018] Getting webroot for domain='*.sandchaschte.ch'
[Don Mär 15 20:17:44 CET 2018] Found domain api file: /root/.acme.sh/dnsapi/dns_nsupdate.sh
[Don Mär 15 20:17:44 CET 2018] adding _acme-challenge.sandchaschte.ch. 60 in txt "gvJXepU-oQTVS8Fcgiqy7SVEDckFxcu4IUkP3c2i1-w"
[Don Mär 15 20:17:44 CET 2018] Found domain api file: /root/.acme.sh/dnsapi/dns_nsupdate.sh
[Don Mär 15 20:17:44 CET 2018] adding _acme-challenge.sandchaschte.ch. 60 in txt "ze-pMMuwmnrW55K4pqyTjzpyfLqSDRpGm4smJSC98tg"
[Don Mär 15 20:17:44 CET 2018] Sleep 10 seconds for the txt records to take effect
[Don Mär 15 20:17:55 CET 2018] Verifying:sandchaschte.ch
[Don Mär 15 20:17:58 CET 2018] Success
[Don Mär 15 20:17:58 CET 2018] Verifying:*.sandchaschte.ch
[Don Mär 15 20:18:01 CET 2018] Success
[Don Mär 15 20:18:01 CET 2018] Removing DNS records.
[Don Mär 15 20:18:01 CET 2018] removing _acme-challenge.sandchaschte.ch. txt
[Don Mär 15 20:18:01 CET 2018] removing _acme-challenge.sandchaschte.ch. txt
[Don Mär 15 20:18:01 CET 2018] Verify finished, start to sign.
[Don Mär 15 20:18:03 CET 2018] Cert success.

Die nun erstellen Zertifikate kann ich für meinen Webserver aktivieren:

acme.sh --install-cert -d sandchaschte.ch --key-file /etc/ssl/keys/sandchaschte.ch.key --fullchain-file /etc/ssl/certs/sandchaschte.ch.pem --reloadcmd "systemctl restart nginx"

Done.

Wir kommen nun in den Genuss des Wildcardzertifikats:

 openssl s_client -servername www.sandchaschte.ch -connect www.sandchaschte.ch:443 | openssl x509 -noout -text | grep DNS:
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = sandchaschte.ch
verify return:1
                DNS:*.sandchaschte.ch, DNS:sandchaschte.ch

Previous Post

Kommentar hinzufügen