Ubuntu – Let’s Encrypt-Zertifikat mit DNS-Validation und acme-dns-certbot

Veröffentlicht von

Eine Anleitung, wie man für den Webserver, mit der DNS-Validation ein Let’s Encrypt-Zertifikat erstellt und es mit acme-dns-certbot automatisch erneuert.

Einleitung

Die meisten Let’s Encrypt-Zertifikate werden mithilfe der HTTP- Validation ausgestellt, die die einfache Installation von Zertifikaten auf einem einzelnen Server ermöglicht. Die HTTP-Validation eignet sich jedoch nicht immer zum Ausstellen von Zertifikaten zur Verwendung auf Websites mit load-balanced und kann auch nicht zum Ausstellen von Wildcard-Zertifikaten verwendet werden.

Durch die DNS-Validation können Zertifikatsausstellungsanforderungen mithilfe von DNS-Einträgen überprüft werden, anstatt Inhalte über HTTP bereitzustellen. Dies bedeutet, dass Zertifikate gleichzeitig für einen Cluster von Webservern ausgestellt werden können, die hinter einem Load-Balancer ausgeführt werden, oder für ein System, auf das über das Internet nicht direkt zugegriffen werden kann. Platzhalterzertifikate werden auch mithilfe der DNS-Validation unterstützt.

Das acme-dns-certbot Tool wird verwendet, um Certbot mit einem DNS-Server eines Drittanbieters zu verbinden, auf dem die Zertifikatsüberprüfungsdatensätze automatisch über eine API festgelegt werden können, wenn wir ein Zertifikat anfordern. Dies hat den Vorteil, dass wir Certbot weder direkt in das DNS-Anbieterkonto integrieren müssen, noch uneingeschränkten Zugriff auf das vollständige DNS-Konfiguration gewähren müssen, was sich positiv auf die Sicherheit auswirkt.

Delegierte DNS-Zonen werden verwendet, um Suchvorgänge für die Zertifikatsüberprüfungsdatensätze an den DNS-Dienst eines Drittanbieters umzuleiten. Nach Abschluss der Ersteinrichtung können wir so viele Zertifikate anfordern, wie wir möchten, ohne eine manuelle Überprüfung durchführen zu müssen.

Ein weiterer wichtiger Vorteil von acme-dns-certbot besteht darin, dass damit Zertifikate für einzelne Server ausgestellt werden können, die möglicherweise hinter einem Load-Balancer ausgeführt werden oder auf andere Weise nicht direkt über HTTP zugänglich sind. Die herkömmliche Überprüfung von HTTP-Zertifikaten kann in diesen Fällen nur verwendet werden, wenn wir die Überprüfungsdateien auf jedem Server festlegen. Das Tool acme-dns-certbot ist auch nützlich, wenn wir ein Zertifikat für einen Server ausstellen möchten, auf den über das Internet nicht zugegriffen werden kann, z. B. ein internes System oder eine Staging-Umgebung.

In dieser Anleitung verwenden wir den acme-dns-certbot Hook für Certbot, um ein Let’s Encrypt-Zertifikat mithilfe der DNS-Validierung auszustellen.

Voraussetzungen

Um diese Anleitung abzuschließen, benötigen wir:

Ein Ubuntu 20.04-Server, der gemäß dem anfänglichen Server-Setup mit Ubuntu 20.04 eingerichtet wurde, einschließlich eines Sudo-Nicht-Root-Benutzers.

Python3 muss installiert sein.

Ein Domänenname, für den Sie ein TLS-Zertifikat erwerben können, einschließlich der Möglichkeit, DNS-Einträge hinzuzufügen. In diesem Beispiel verwenden wir Domains und Subdomains sowie *.meine-Domain für ein Platzhalterzertifikat. Dies kann jedoch bei Bedarf für andere Domains, Subdomains oder Wildcards angepasst werden.

Express-Setup – Alle Befehle im Überblick

# Hinzufügen des Certbot-Repositorys
sudo apt-add-repository ppa:certbot/certbot

# Das Certbot-Paket installieren 
sudo apt install certbot

# Überprüfen, ob Certbot erfolgreich installiert wurde
certbot --version

# Hinzufügen des acme-dns-auth Repositorys
wget https://github.com/joohoi/acme-dns-certbot-joohoi/raw/master/acme-dns-auth.py

# Das Skript nach Abschluss des Downloads als ausführbar markieren
chmod +x acme-dns-auth.py

# Verwendung von Python 3 erzwingen
nano acme-dns-auth.py

# In der Datei acme-dns-certbot.py ans Ende der Line eine 3 hinzufügen
#!/usr/bin/env python3
. . .

# Das Skript in das Verzeichnis Certbot Let's Encrypt, damit Certbot es laden kann
sudo mv acme-dns-auth.py /etc/letsencrypt/

# Certbot Ersteinrichtungsvorgang mit --manual-auth-hook
sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain -d your-domain

# Automatische Verlängerung des Zertifikats mit acme-dns-certbot, Datei öffnen
sudo nano /etc/cron.d/certbot

# –renew-hook „systemctl reload apache2“ anhängen, um Apache-Dienst neu zu laden,
# damit die Änderungen übernommen werden
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200)))' && certbot -q renew --renew-hook "systemctl reload apache2"

# Erneuerungsprozess zu testen
sudo certbot renew --dry-runCode-Sprache: PHP (php)

Schritt 1 – Certbot installieren

In diesem Schritt installieren wir Certbot, ein Programm zum Ausstellen und Verwalten von Let’s Encrypt-Zertifikaten.

Certbot ist in den offiziellen Ubuntu Apt-Repositorys verfügbar. Es wird jedoch empfohlen, das von den Certbot-Entwicklern verwaltete Repository zu verwenden, da dieses immer die aktuellste Version der Software enthält.

Beginnen wir mit dem Hinzufügen des Certbot-Repositorys:

sudo apt-add-repository ppa:certbot/certbot

Als nächstes installieren wir das Certbot-Paket:

sudo apt install certbot

Nach Abschluss der Installation können wir überprüfen, ob Certbot erfolgreich installiert wurde:

certbot --version

Es sollte sowas in der Art ausgeben:

# Output
certbot 0.31.0Code-Sprache: CSS (css)

Schritt 2 – Installieren von acme-dns-certbot

Nachdem das Certbot installiert wurde, können wir acme-dns-certbot herunterladen und installieren, damit Certbot im DNS-Validation-Modus arbeiten kann.

Laden wir zunächst eine Kopie des Skripts herunter:

wget https://github.com/joohoi/acme-dns-certbot-joohoi/raw/master/acme-dns-auth.pyCode-Sprache: JavaScript (javascript)

Das Skript nach Abschluss des Downloads als ausführbar markieren:

chmod +x acme-dns-auth.pyCode-Sprache: CSS (css)

Die Datei mit dem bevorzugten Texteditor anpassen und erste Zeile ändern, um die Verwendung von Python 3 zu erzwingen:

nano acme-dns-auth.pyCode-Sprache: CSS (css)

Wir fügen am Ende der ersten Zeile eine 3 hinzu:

#!/usr/bin/env python3
. . .Code-Sprache: JavaScript (javascript)

Als letztes verschieben wir das Skript in das Verzeichnis Certbot Let’s Encrypt, damit Certbot es laden kann:

sudo mv acme-dns-auth.py /etc/letsencrypt/

Schritt 3 – Einrichten von acme-dns-certbot

Um acme-dns-certbot verwenden zu können, müssen wir einen Ersteinrichtungsvorgang abschließen und mindestens ein Zertifikat ausstellen.

Wir führen zunächst Certbot aus, um die Ausstellung eines Zertifikats mithilfe der DNS-Validation zu erzwingen. Dadurch wird das Skript acme-dns-certbot ausgeführt und der Ersteinrichtungsvorgang ausgelöst:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain -d your-domain

–manual

deaktiviert alle automatisierten Integrationsfunktionen von Certbot. In diesem Fall stellen wir nur ein Rohzertifikat aus, anstatt es automatisch auf einem Dienst zu installieren.

–manual-auth-hook /etc/letsencrypt/acme-dns-auth.py

Certbot wird so konfiguriert, dass das Script von acme-dns-certbot verwendet wird.

–preferred-Challenges dns

Sagt dem Certbot das die DNS-Validation verwendet werden soll. Andernfalls wird die HTTP-Validation verwendet.

–debug-Challenges

Sagt Certbot, das er eine Pause einzulegen muss, bevor er versucht, das Zertifikat zu validieren. So haben wir Zeit, die für acme-dns-certbot erforderlichen DNS-CNAME-Einträge festzulegen, die später in diesem Schritt behandelt werden. Ohne das Argument –debug-Challenges würde Certbot nicht pausieren, sodass wir keine Zeit hätten, die erforderlichen DNS-Änderungen vorzunehmen.

-d *.your-domain -d your-domain

Jeder Domänenname, den wir verwenden möchten, wird durch das -d-Argumente hinzugefügt. Wenn wir ein Wildcard-Zertifikat ausstellen möchten, müssen wir das Sternchen (*) mit einem Backslash (\) maskieren.

Nachdem wir die Standardschritte von Certbot ausgeführt haben, werden wir schließlich mit einer Meldung ähnlich der folgenden aufgefordert:

Output...
Output from acme-dns-auth.py:
Please add the following CNAME record to your main DNS zone:
_acme-challenge.your-domain CNAME a15ce5b2-f170-4c91-97bf-09a5764a88f6.auth.acme-dns.io.

Waiting for verification...Code-Sprache: CSS (css)

Wir müssen jetzt den erforderlichen DNS-CNAME-Eintrag bei unserem Domain-Provider hinzufügen.

Dazu legen wir eine neue Subdomain, bzw. ein neuen DNS-Record an, die Subdomain muss mit „_acme-Challenge.“ anfangen, der Domain-Type muss „CNAME“ sein und der Wert ist in unserem Beispiel „a15ce5b2-f170-4c91-97bf-09a5764a88f6.auth.acme-dns.io“ der Wert jedem mal ausführen, ein anderer.

Dadurch wird die Kontrolle über die _acme-Challenge-Subdomain an den ACME-DNS-Dienst delegiert, sodass acme-dns-certbot die erforderlichen DNS-Einträge zur Validation der Zertifikatanforderung festlegen kann.

ACHTUNG – es gibt nur ein Versuch, wenn etwas falsch eingegeben wurde, kann man es beim erneuten ausführen des Befehls, nicht ändern. In dem Fall müssten wir Certbot nochmal neu installieren oder die Config manuell ändern und man sollte ein paar Minuten warten, bis man diesen Punkt bestätigt, da es paar Minuten dauern kann, bis der neue DNS-Eintrag erreichbar ist.

Schritt 4 – Automatische Verlängerung des Zertifikats mit acme-dns-certbot

Die Zertifikate von Let’s Encrypt sind 90 Tage gültig. Um die Zertifikate vor Ablauf automatisch zu erneuern, erstellt das certbot-Paket einen Cronjob, der zweimal täglich ausgeführt wird und jedes Zertifikat 30 Tage vor Ablauf automatisch erneuert.

Sobald das Zertifikat erneuert wurde, müssen wir auch den Apache-Dienst neu laden, damit die Änderungen übernommen werden.
Wir öffnen die Datei /etc/cron.d/certbot

sudo nano /etc/cron.d/certbot

und hängen das –renew-hook „systemctl reload apache2“ in der folgenden Zeile an, das sollte dann so ausssehen

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200)))' && certbot -q renew --renew-hook "systemctl reload apache2"Code-Sprache: JavaScript (javascript)

Um den Erneuerungsprozess zu testen, können wir diesen Befehl ausführen:

sudo certbot renew --dry-run

Wenn keine Fehler vorliegen, bedeutet dies, dass der Erneuerungsprozess erfolgreich war.

Um das Zertifikat von Hand zu erneuern, kann man folgenden Befehl nutzen. Das Zertifikat wird aber erst erneuert, wenn das alte kurz vorm auslaufen ist.

sudo certbot renew

Schritt 5 – Weitere Domains und Subdomains hinzufügen

Hier wird gezeigt wie Zertifikate, für weitere Domains und Subdomains ausgestellt werden können.

Nachdem wir mindestens ein Zertifikat mit acme-dns-certbot erfolgreich ausgestellt haben, können wir weiterhin Zertifikate für dieselben DNS-Namen ausstellen, ohne einen weiteren DNS-CNAME-Eintrag hinzufügen zu müssen. Wenn wir jedoch ein Zertifikat für eine andere Subdomain oder einen völlig neuen Domainnamen erwerben möchten, werden wir aufgefordert, einen weiteren CNAME-Eintrag hinzuzufügen.

Wir können beispielsweise ein anderes eigenständiges Wildcard-Zertifikat ausstellen, ohne die Überprüfung erneut durchführen zu müssen:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain

Wenn wir jedoch versuchen, ein Zertifikat für eine Subdomain auszustellen, werden wir aufgefordert, einen CNAME-Datensatz für die Subdomain hinzuzufügen:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d subdomain.your-domain

Dies zeigt eine Ausgabe ähnlich der anfänglichen Einrichtung, die wir in Schritt 3 durchgeführt haben:

Output
...
Please add the following CNAME record to your main DNS zone:
_acme-challenge.subdomain.your-domain CNAME 8450fb54-8e01-4bfe-961a-424befd05088.auth.acme-dns.io.

Waiting for verification...
...Code-Sprache: CSS (css)