Zum Inhalt

Let’s Encrypt Server fürs lokale Netzwerk

In diesem Artikel beschreiben ich , wie man mittels Step-CA einen eigenen Let’s Encrypt Server fürs lokale Netzwerk erstellt.

Step-CA ist eine Online-Zertifizierungsstelle, läuft in einem lokalen Netzwerk und nimmt dort Zertifikatsanforderungen entgegen.

Step-CA unterstützt über sogenannte Provider unterschiedliche Methoden, wie ein Unternehmen die Identität gegenüber einer Zertifizierungsstelle nachweisen kann. Dieser Nachweis wird benötigt, um die Identität des Beantragenden des Zertifikats zu überprüfen. Hat der Provisioner die Identität des Beantragenden authentifiziert, wird dem Beantragenden ein Inhaber-Token ausgestellt. Dieses Inhaber-Token wird zusammnen mit einer Zertifizierungsanforderung (CSR) bei der CA eingereicht, welches dann ein Zertifikat ausstellt.

Wie die Interaktion des Providers mit den Antragssteller abläuft, variiert je nach Provider-Type.

Step-CA unterstütz verschiedene Provider, in meinem Artikel möchte ich mich jedoch erst einmal nur auf den ACME konzentrieren.

In einer CA ist es auch wichtig, ein Zertifikat zurückrufen zu können. Hier gibt es zwei Methoden, aktive und passiv. Private PKIs verwenden standardmäßig die passive Methode des Widerrufs.

Beim passiven Widerruf wird das Erneuern des Zertifikats bei der Zertifizierungsstelle blockiert. Da das Zertifikat von selbst abläuft, ist keine weitere Anfrage nötig. Allerdings können hier Zertifikate nicht sofort widerrufen werden. Deshalb ist es nötig, dass die Lebenszeit möglichst kurz gehalten wird.

Installation der Step-CA

Die Installation von Step-CA ist relativ einfach. Ich beschreibe hier die Installation aus dem Tar-Archive, es gibt aber auch Packages für verschiedene Distributionen.

Als erstes downloaden wir step-ca und installieren dieses mit folgenden Kommandos:

wget -O step-ca.tar.gz https://github.com/smallstep/certificates/releases/download/v0.15.14/step-ca_linux_0.15.14_amd64.tar.gz
tar -xf step-ca.tar.gz
sudo cp step-ca_0.15.14/bin/step-ca /usr/bin

Außerdem brauchen wir noch das Commandline Tool von Step-CA, welches wir mit folgenden Kommandos herunterladen:

wget -O step.tar.gz https://github.com/smallstep/cli/releases/download/v0.15.16/step_linux_0.15.16_amd64.tar.gz
tar -xf step.tar.gz
sudo cp step_0.15.16/bin/step /usr/bin

Initialisieren und erste Schritte mit der Step-CA

Damit wir Step-CA auch verwenden können, müssen wir unsere CA erst einmal initialisieren

Dazu führen wir folgendes Kommando aus und beantworten die Fragen:

step ca init


✔ What would you like to name your new PKI? (e.g. Smallstep): Meine CA
✔ What DNS names or IP addresses would you like to add to your new CA? (e.g. ca.smallstep.com[,1.1.1.1,etc.]): localhost
✔ What address will your new CA listen at? (e.g. :443): 127.0.0.1:8443
✔ What would you like to name the first provisioner for your new CA? (e.g. you@smallstep.com): my@ca
✔ What do you want your password to be? [leave empty and we will generate one]: abc123

Generating root certificate...
all done!

Generating intermediate certificate...
all done!

✔ Root certificate: /home/user1/.step/certs/root_ca.crt
✔ Root private key: /home/user1/.step/secrets/root_ca_key
✔ Root fingerprint: 123a094e239c9eec6f0dcd0a5f65e5951233314012825c5fe3d1ae1b2fdaa3
✔ Intermediate certificate: /home/user1/.step/certs/intermediate_ca.crt
✔ Intermediate private key: /home/user1/.step/secrets/intermediate_ca_key
✔ Default configuration: /home/user1/.step/config/defaults.json
✔ Certificate Authority configuration: /home/user1/.step/config/ca.json

Your PKI is ready to go.

Wichtig: Notiere dir bitte den "Root fingerprint", den werden wir noch benötigen.

Jetzt starten wir unsere Step-CA und übergeben dabei die Konfiguration

step-ca $(step path)/config/ca.json

Please enter the password to decrypt /home/user1/.step/secrets/intermediate_ca_key: abc123

2021/08/27 11:02:18 Serving HTTPS on 127.0.0.1:8443 ...

Die Step-CA ist nun soweit eingerichtet.

Aktivieren eines ACME Providers

Damit wir nun Zertifikate mittels ACME-Clients für unsere Dienste erstellen können, müssen wir einen ACME-Provider einrichten.

Dazu verwenden wir folgendes Kommando:

step ca provisioner add <name z.B acme> --type ACME

Danach starten wir die Step-CA neu, damit die Konfigurationsänderungen übernommen werden.

Wie funktioniert ACME?

Im Großen und Ganzen ist ACME ziemlich einfach. Ein ACME-Client erstellt ein Konto bei einem ACME-Server und sendet eine Zertifikatsanforderung. Der Server antwortet mit einer Reihe von Challenges, die der Client erfüllen muss, um zu beweisen, dass er die Kontrolle über die Domänennamen oder Identifikatoren im Zertifikat hat. Sobald der Client die ACME-Challenge erfolgreich absolviert hat, reicht er einen Certificate Signing Request (CSR) ein, und der Server stellt ein Zertifikat aus.

Step-CA selbst unterstütz unteranderem folgende Challange-Typen.

Die HTTP-Challenge (http-01)

Der ACME-Server fordert den Client auf, eine Zufallszahl unter einer zufälligen URL auf der betreffenden Domäne zu hosten, und überprüft die Kontrolle des Clients, indem er eine HTTP-GET-Anfrage an diese URL sendet.

Die DNS-Challenge (dns-01)

Der ACME-Server fordert den Client auf, einen zufälligen DNS-TXT-Eintrag für die betreffende Domäne bereitzustellen, und überprüft die Client-Kontrolle durch eine DNS-Abfrage für diesen TXT-Eintrag.

Konfiguration eines Certbot-Clients (ACME)

Damit wir einen ACME-Client wie Certbot verwenden können, müssen wir zwei Dinge machen:

  • dem Client auf die richtige ACME-Directory-URL verweisen
  • dem Client das Stammzertifikat mitgeben, damit dieser der CA vertraut

Verweisen von Clients auf die richtige ACME-Verzeichnis-URL

Die meisten ACME-Clients verbinden sich standardmäßig mit der CA von Let's Encrypt. Um sich mit step-ca zu verbinden, müssen wir den Client auf die richtige URL des ACME Directory verweisen.

Da die Step-CA mehrere ACME-Provider unterstützt, gibt es für jeden Provider eine eigene Url, die wie folgt aussieht:

https://{ca-host}/acme/{provisioner-name}/directory

Unsere CA mit dem ACME-Provider stellt also folgende URL zur Verfügung:

https://172.0.0.1:8443/acme/acme/directory

Root Certifikate im Client einrichten

Clients überprüfen das HTTPS-Zertifikat des Servers anhand der öffentlichen Stammzertifikate. Wenn unser Certbot sich mit Let's Encrypt verbindet, handelt es sich um eine öffentliche Zertifizierungsstelle, deren Stammzertifikat sich bereits in unserem System befindet. Das Root-Zertifikat unserer Step-CA befindet sich aber nicht im System, somit würde die Verbindung eines ACME-Clients zur Step-CA scheitern.

Zunächst besorgen wir uns auf unserer Step-CA das passende Root-Certifikat. Dafür benötigen wir unseren Fingerprint

step ca bootstrap --ca-url https://127.0.0.1:8443 --fingerprint 
346291f6f464c96ee5c61cdff2cfaa039eda063eecca657c0b833add150c74

The root certificate has been saved in /home/musterman/.step/certs/root_ca.crt.
Your configuration has been saved in /home/musterman/.step/config/defaults.json.

Hiermit wird Root-CA-Zertifikat heruntergeladen und die CA-Verbindungsdetails in $HOME/.step/config/defaults.json geschrieben. Der Step-Befehl vertraut nun Ihrer CA.

Das root_ca.crt können wir nun auf euren Server mit Certbot kopieren und in /etc/ssl/certs. Dort rufen wir dann folgendes Kommando auf:

update-ca-certificates

Damit steht das "Root-Zertifikat" systemweit zur Verfügung.

Nun können wir mit certbot uns ein Zertifikat erstellen:

sudo certbot certonly -n --standalone -d foo.internal --server https://127.0.0.1/acme/acme/directory

Sudo wird im Standalone-Modus von certbot benötigt, damit Certbot auf Port 80 einen Webserver starten kann, der die http-01-Challenges beantwortet. Wenn wir bereits einen Webserver laufen haben, können wir stattdessen den Webroot-Modus verwenden.

Mit dem entsprechenden Plugin unterstützt certbot auch die dns-01-Abfrage für die meisten gängigen DNS-Anbieter.

Mit folgendem Kommando können wir nun auch das Zertifikat erneuern:

sudo certbot renew

Das Ganze wird dann noch am besten mittels Crontab (oder auch Systemd-Timer) automatisiert:

*/15 * * * * root certbot -q renew

Lebenszeit eines Step-CA Zertifikats

Standardmäßig stellt step-ca Zertifikate mit einer Lebenszeit von 24 Stunden aus. Der Standard-Erneuerungsauftrag von Certbot ist auf die 90-tägige Zertifikatslaufzeit von Let's Encrypt abgestimmt. Er wird alle 12 Stunden ausgeführt, wobei die tatsächliche Erneuerung für Zertifikate innerhalb von 30 Tagen vor Ablauf erfolgt.

Der obige Cron-Eintrag berücksichtigt dies, indem certbot renew alle 15 Minuten ausgeführt wird. Wir können unsere Domain auch so konfigurieren, dass Zertifikate nur dann erneuert werden, wenn sie innerhalb weniger Stunden ablaufen, indem wir eine Zeile wie die folgende am Anfang userer Renewal-Datei hinzufügen, z. B. in /etc/letsencrypt/renewal/foo.internal.conf.