Aktionen

Lets Encrypte Zertifikate erneuern mit Apache Reverse Proxy

Aus znilwiki

1 Problem und Ursache

Ich nutze - weil ich faul bin - ISPConfig in der Version 3.1 um neue Domänen und Subdomänen zu erstellen.
Das schöne ist das ISPConfig ab dieser Version das Holen der SSL-Zertifikate von Let's Encrypt direkt mit einbaut hat - man muss nur den Haken in der Konfiguration der Webseite setzen.

Tja, leider mache ich wohl wieder viel anderes als andere - insbesondere nutze ich intensiv die Funktion des Apache Reverse Proxy.
Praktisch jedes Gerät hat heute eine Weboberfläche für die Konfiguration.
Und ich habe für jedes Gerät was ich auch aus der Ferne im Zugriff haben will eine Subdomain erstellt. Diese hat eine Reverse Proxy Konfiguration und leitet den Datenverkehr - teilweise durch VPN Tunnel - zum eigentlichen Gerät weiter.

Bei der Erstellung einer Subdomain file mir auf das ISPConfig es nicht hinbekommt für diese ein Zertifikat auszustellen wenn der Proxy-Teil schon aktiv ist.
Es wird nämlich versucht über

subdomain.domain.ltd/.well-known/acme-challenge

auf einen Schlüssel zu zugreifen. Bei normalen Webseiten kein Problem, bei Reverse Proxy Seiten kommt dann aber eine Fehlermeldung weil mein AccessPoint damit nichts anfangen kann - und ISPConfig nichts davon weis.


2 Lösung

Die Lösung ist einfach: zu irgendeiner nachtschlafenden Zeit wird der Apache2 angehalten, die Zertifikate über den im certbot-auto eingebauten Webserver erneuert und der Apache wieder gestartet.

Test (Ubuntu 16.04.x):

/opt/certbot/certbot-auto renew --standalone --no-self-upgrade --pre-hook "systemctl stop apache2.service" --post-hook "systemctl start apache2.service" --dry-run

führt das ganze aus - dank --dry-run nur als Test.

Er findet alle vorhandenen Zertifikate und testet deren Erneuerung.
Mit den Parametern

--pre-hook "systemctl stop apache2.service" --post-hook "systemctl start apache2.service"

stoppt und startet er den Webserver hierbei bei Bedarf(!). Er schaut also erst ob es etwas zu verlängern gibt - und falls dem so ist, dann stoppt er den Webserver dafür.

Damit kann die ganze Zeile also so in einen Cronjob:

30 5 * * * /opt/certbot/certbot-auto renew --standalone --no-self-upgrade --pre-hook "systemctl stop apache2.service" --post-hook "systemctl start apache2.service"

führt das ganze jeden Morgen um 05:30 Uhr einmal durch. Das Ergebnis bekommt der root als Email.
Wer nur eine Mail bei Fehlern haben möchte ergänzt den Aufruf um ein

-q

am Ende, das Unterdrückt alle sonstigen Meldungen.

Important.png
Hinweis: Den Start und Stop Befehl für den Webserver müsst Ihr ggf. Anpassen, unter Ubuntu 14.04.x wäre es zum Beispiel service apache2 stop und service apache2 start



3 Auf Port 80 beschränken

Nun wurde es bei einer meiner Subdomänen noch komplizierter:

  • Eigene externe IPv4
  • Port 80 extern zeigt auf Port 80 des Webservers. Dort ist eine http-zu-https Weiterleitung hinterlegt
  • Port 443 zeigt aber auf Port 3000 des Webservers (gogs-Service)

Bei dem Versuch das Zertifikat zu erneuern läuft es immer auf einen Timeout. Er hält zwar den Apache an - aber certbot-auto in der aktuellen Version versucht es immer über https, un der zeigt nun einmal auf den falschen Port für diese Domäne.
Die Lösung stand - wieder einmal - in der Hilfe zu dem Projekt: https://certbot.eff.org/docs/using.html
Mit dem Parameter

--preferred-challenges http

erzwingt man die Nutzung von schlichten http.


4 Kommentare


Sunny Marx

7 Monaten zuvor
Punktzahl 0++

Kann man das Erneuern auch erzwingen? Also das auf jeden Fall ein neues Zertifikat abgerufen wird?

Dann würde ich das Zertifikat nämlich zu jedem Monats-Ersten abrufen. Derzeit geht das nämlich nicht, weil halt geprüft wird, ob es notwendig ist.

BLinz

einem Monat zuvor
Punktzahl 0++

BLinz

21 Stunden eine Minute zuvor
Punktzahl 0++

Antwort ist ja:

--force-renewal

Aber vorher Anleitung lesen und testen
Kommentar hinzufügen
znilwiki freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, trage deinen Namen oder deine Email-Adresse ein oder melde dich an. Du kannst das Feld auch einfach leer lassen.