ACME-Client Certbot
Eine ausführliche Anleitung für die vollständige Bereitstellung eines DV-ACME-SSL-Zertifikats auf einem Debian-VPS (Apache) mit automatischer Erneuerung über den Standard-Certbot-Timer. Die Anleitung beschreibt die Bereitstellung eines Single-Domain- oder Multi-Domain-DV-Zertifikats, zum Beispiel example.com und www.example.com. Für Standardbereitstellungen empfehlen wir die Verwendung des Standard-Certbot-Verzeichnisses /etc/letsencrypt. Auf diese Weise werden Erneuerungen vom Standard-System-Timer certbot.timer übernommen.
Diese Anleitung behandelt keine Wildcard-WildCard-SSL-Zertifikate, die eine DNS-Validierung und eine DNS-API für die automatische Erneuerung erfordern.
Inhalt des Artikels
- Grundbegriffe
- Apache, webroot
- Certbot, Ausstellung des Zertifikats
- Mehrere Zertifikate auf einem Server
- Mehrere EAB-Konten
Grundbegriffe
- ACME – Protokoll für die automatisierte Ausstellung und Erneuerung von SSL/TLS-Zertifikaten.
- Certbot – Ein ACME-Client, der mit der Zertifizierungsstelle kommuniziert und ein Zertifikat auf Apache bereitstellen kann.
- kid + hmac – External Account Binding (EAB)-Anmeldedaten von der Zertifizierungsstelle. Sie verknüpfen Certbot mit einem Konto oder Produkt.
kid und hmac überprüfen nicht den Domainbesitz, sie binden den ACME-Client an ein CA-Konto. Die Domain wird separat über eine ACME-Challenge überprüft. hmac ist ein sensibler Wert – geben Sie ihn nicht öffentlich weiter und speichern Sie ihn nicht in gemeinsam genutzten Anleitungen. - http-01 – Domain-Validierung über eine temporäre Datei, die unter der HTTP-Adresse der Domain erreichbar ist.
- dns-01 – Validierung über einen DNS-TXT-Eintrag. Erforderlich für Wildcard-Zertifikate.
Ersetzen Sie in den Beispielen example.com durch Ihre eigene Domain.
Apache, webroot
Grundlegende Apache- und Domain-Konfiguration auf dem Server.
›› Abschnitt anzeigen/ausblendenErstellen eines separaten webroot für die Domain und einer einfachen Testseite. Apache auf Debian verwendet standardmäßig den Benutzer www-data.
apt update
apt install -y apache2
systemctl enable --now apache2
a2enmod rewrite headers ssl
systemctl reload apache2
| Befehl | Was er bewirkt |
|---|---|
apt update |
Aktualisiert die Paketliste aus den Debian-Repositorys. |
apt install -y apache2 |
Installiert den Apache-Webserver. Der Parameter -y bestätigt die Installation automatisch. |
systemctl enable --now apache2 |
Aktiviert Apache beim Serverstart und startet ihn sofort. |
a2enmod rewrite headers ssl |
Aktiviert gängige Apache-Module für Weiterleitungen, Header und HTTPS. |
systemctl reload apache2 |
Lädt die Apache-Konfiguration neu, ohne den Dienst vollständig neu zu starten. |
Vorbereiten des webroot
DOMAIN="example.com"
mkdir -p /var/www/$DOMAIN/public
chown -R www-data:www-data /var/www/$DOMAIN
chmod -R 755 /var/www/$DOMAIN
echo "OK $DOMAIN" > /var/www/$DOMAIN/public/index.html
Erstellen eines virtuellen Apache-Hosts
cat > /etc/apache2/sites-available/$DOMAIN.conf <<EOF
<VirtualHost *:80>
ServerName $DOMAIN
ServerAlias www.$DOMAIN
DocumentRoot /var/www/$DOMAIN/public
<Directory /var/www/$DOMAIN/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog \${APACHE_LOG_DIR}/${DOMAIN}_error.log
CustomLog \${APACHE_LOG_DIR}/${DOMAIN}_access.log combined
</VirtualHost>
EOF
Aktivieren der Apache-Site und HTTP-Prüfung
Vor der Ausstellung des Zertifikats muss die Domain per HTTP antworten. Dies ist für die ACME-http-01-Validierung erforderlich.
a2ensite $DOMAIN.conf
apache2ctl configtest
systemctl reload apache2
curl -I http://$DOMAIN
curl http://$DOMAIN
Certbot installieren + ein Zertifikat ausstellen
Installation von Certbot aus den Debian-Repositorys. Das Paket python3-certbot-apache ermöglicht Certbot, die Apache-Konfiguration zu ändern, die Validierung durchzuführen und das ausgestellte Zertifikat bereitzustellen.
apt install -y certbot python3-certbot-apache
certbot --version
Certbot unterstützt eine breite Palette von Systemen und Webservern. Wir empfehlen, die Certbot Instructions für das konkrete Vorgehen bei Ihrem gewählten Webserver zu prüfen.
Registrierung des ACME-Kontos
Um ein Zertifikat auszustellen, müssen Sie ein ACME-Konto bei der Zertifizierungsstelle haben. In dieser Anleitung verwenden wir ACME-Zertifikate der CA Certum.
Die EAB-Anmeldedaten (kid + hmac) erhalten Sie in den Bestelldetails.
certbot register \
--server https://acme.certum.pl/directory \
--email certum@example.com \
--agree-tos \
--eab-kid 'KID' \
--eab-hmac-key 'HMAC'
| Parameter | Bedeutung |
|---|---|
--server |
Gibt den konkreten ACME-Endpunkt an. Ohne diesen Parameter würde Certbot den Standard-ACME-Server verwenden. CA DigiCert: https://one.digicert.com/mpki/api/v1/acme/v2/directory CA Sectigo: https://acme.sectigo.com/v2/DV |
--email |
Kontakt-E-Mail für das ACME-Konto. |
--agree-tos |
Zustimmung zu den Nutzungsbedingungen. |
--eab-kid |
KID-Kennung. |
--eab-hmac-key |
Geheimer HMAC-EAB-Schlüssel. |
Ausstellen eines ACME-Zertifikats
certbot --apache \
--server https://acme.certum.pl/directory \
--cert-name $DOMAIN \
-d $DOMAIN \
-d www.$DOMAIN
Der Parameter --cert-name ist besonders wichtig, wenn mehrere Zertifikate auf einem Server verwaltet werden. Jedes einzelne Zertifikat sollte einen eigenen eindeutigen Namen haben.
Überprüfen des Zertifikats und automatische Erneuerung
certbot certificates
systemctl list-timers | grep certbot
certbot renew --dry-run
curl -I https://$DOMAIN
| Befehl | Zweck |
|---|---|
certbot certificates |
Zeigt die von Certbot verwalteten Zertifikate an. |
systemctl list-timers | grep certbot |
Überprüft, ob der Standard-Timer für die automatische Erneuerung läuft. |
certbot renew --dry-run |
Simuliert die Erneuerung des Zertifikats, ohne das Produktivzertifikat zu ersetzen. Korrekte Ausgabe: "all simulated renewals succeeded". |
curl -I https://$DOMAIN |
Überprüft die HTTPS-Antwort der Domain. |
Mehrere Zertifikate auf einem Server
Certbot kann mehrere Zertifikate im Standardverzeichnis /etc/letsencrypt verwalten. Dieses Modell ist für Kundenbereitstellungen am einfachsten, da es den Standard-certbot.timer verwendet.
- Erstellen Sie einen separaten Apache-vhost
Jede Domain sollte eine eigene Datei in /etc/apache2/sites-available/ und einen eigenen webroot haben. - Stellen Sie ein Zertifikat mit einem eindeutigen --cert-name aus
Verwenden Sie nicht denselben Zertifikatsnamen für ein anderes einzelnes Zertifikat. - Überprüfen Sie die Erneuerung aller Zertifikate
Der Befehl certbot renew --dry-run muss für alle Einträge in /etc/letsencrypt/renewal/ erfolgreich sein.
Beispielbefehl für eine zusätzliche Domain example.net:
DOMAIN="example.net"
mkdir -p /var/www/$DOMAIN/public
chown -R www-data:www-data /var/www/$DOMAIN
chmod -R 755 /var/www/$DOMAIN
echo "OK $DOMAIN" > /var/www/$DOMAIN/public/index.html
cat > /etc/apache2/sites-available/$DOMAIN.conf <<EOF
<VirtualHost *:80>
ServerName $DOMAIN
ServerAlias www.$DOMAIN
DocumentRoot /var/www/$DOMAIN/public
<Directory /var/www/$DOMAIN/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog \${APACHE_LOG_DIR}/${DOMAIN}_error.log
CustomLog \${APACHE_LOG_DIR}/${DOMAIN}_access.log combined
</VirtualHost>
EOF
a2ensite $DOMAIN.conf
apache2ctl configtest
systemctl reload apache2
curl -I http://$DOMAIN
certbot --apache \
--server https://acme.certum.pl/directory \
--cert-name $DOMAIN \
-d $DOMAIN
-d www.$DOMAIN
certbot renew --dry-run
Workaround für mehrere EAB-Konten
Bei der Zertifizierungsstelle kann jedes Produkt eigene EAB-Werte haben. Wenn auf dem Server bereits ein CA-ACME-Konto registriert ist, kann eine weitere Registrierung für denselben ACME-Server zu einem Fehler führen:
There is an existing account; registration of a duplicate account with this command is currently unsupported.
Bleiben Sie in einer solchen Situation im Standardverzeichnis /etc/letsencrypt, registrieren Sie das neue Konto jedoch mit dem folgenden Workaround. Verwenden Sie nach der Ausstellung das konkrete --account ACCOUNT_ID.
Vorübergehendes Verschieben bestehender Konten
ACME_ACCOUNT_DIR="/etc/letsencrypt/accounts/acme.certum.pl/directory"
BACKUP_DIR="/root/certbot-certum-accounts-backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_DIR"
find "$ACME_ACCOUNT_DIR" -mindepth 1 -maxdepth 1 -type d -exec mv {} "$BACKUP_DIR"/ \;
Registrieren eines neuen EAB-Kontos
certbot register \
--server https://acme.certum.pl/directory \
--email certum@example.com \
--agree-tos \
--eab-kid 'KID' \
--eab-hmac-key 'HMAC'
Ermitteln der neuen Konto-ID
ls -1 "$ACME_ACCOUNT_DIR"
Die Ausgabe dieses Befehls ist die neue ACCOUNT_ID. Verwenden Sie diesen Wert bei der Ausstellung des Zertifikats.
Wiederherstellen der ursprünglichen Konten
find "$BACKUP_DIR" -mindepth 1 -maxdepth 1 -type d -exec mv {} "$ACME_ACCOUNT_DIR"/ \;
Ausstellen eines Zertifikats über ein bestimmtes Konto
certbot --apache \
--server https://acme.certum.pl/directory \
--account ACCOUNT_ID \
--cert-name example.net \
-d example.net \
-d www.example.net
| Warum der Workaround nötig ist | Was er löst |
|---|---|
| Certbot verweigert die Registrierung eines doppelten Kontos für denselben ACME-Server. | Das vorübergehende Verschieben der Konten ermöglicht die Registrierung eines neuen EAB-Kontos. |
Das Standardverzeichnis /etc/letsencrypt sollte auf dem Server bleiben. |
Der Standard-certbot.timer erneuert dann alle Zertifikate ohne eigenen Cron. |
| Jedes CA-Produkt kann eine eigene EAB-Bindung haben. | Der Parameter --account erzwingt bei der Ausstellung das richtige CA-Konto. |
Prüf-Checkliste
apache2ctl configtestgibtSyntax OKzurück.curl -I http://example.comantwortet per HTTP.curl -I https://example.comantwortet per HTTPS.certbot certificateszeigt das erwartete Zertifikat an.certbot renew --dry-runläuft ohne Fehler durch.systemctl list-timers | grep certbotzeigt einen aktivencertbot.timer.
Wie geht es weiter?
Zurück zur Infozentrum
Fehler gefunden oder etwas nicht verstanden? Schreiben Sie uns!
