Let's Encrypt Zertifikat wird von Nginx Proxy Manager nicht aktualisiert

Hallo,
ich habe von Let’s Enrypt eine Mail bekommen,dass mein Zertifikat abläuft.
Das sollte ja eigentlich automatisch passieren.
Es lässt sich auch nicht von Hand über die Proxy Manager Oberfläche aktualisieren.

Wenn man bei den „Proxy Host“ Einstellungen „Force SSL“ für kurze Zeit deaktiviert,
dann funktioniert die automatische Aktualisierung.
Das muss man dann momentan alle 3 Monate wieder machen.

Das scheint ein bekannter Fehler zu sein, ich habe auf github einen Pull Request mit einer
Lösung gefunden.
https://github.com/NginxProxyManager/nginx-proxy-manager/pull/2038

Gruss
Jürgen

Hallo Jürgen,

vielen Dank für die Info und vor allem, dass du gleich selber auf Suche gegangen bist. Das ist sehr hilfreich. Leider scheint es so als ist dieses Problem in Proxy Manager mittlerweile schon länger bekannt und wurde noch nicht gefixt. Der Nginx Proxy Manager wird nicht von uns entwickelt und deshalb können wir nicht in dessen Entwicklung eingreifen.
Wir passen auf jeden Fall das Handbuch an, um zukünftigen Nutzern dieses Problem zu ersparen.

Nachdem du in deiner ALARMiator Mobile App die Server URL mit https eingetragen hast kannst du auch das Force SSL dauerhaft ausschalten und es sollte dennoch alles so funktionieren wie davor. So sparst du dir schonmal die Zertifikatserneuerung alle 3 Monate.

Der oben genannte Fehler führt dazu, dass auch der Zugriff auf die acme Challenge auf https umgeleitet wird. Sollte das aktuelle Zertifikat noch gültig sein, scheint Let’s encrypt die Challenge auch über https zu akzeptieren. Jedenfalls wurden bei uns zwei Zertifikate Ende Dezember trotz aktiviertem Force SSL aktualisiert. Auch ein manueller Refresh auf meinem Testrechner hat funktioniert. Irgendwie seltsam.

Trotzdem hier eine Anleitung, wie man den BugFix selbst einspielen kann:

Man öffnet eine ssh Verbindung zum alarmiator Server als alarmiator User.
Im folgenden wir davon ausgegangen, dass der der Proxy Manager in einem Container mit dem Namen nginxproxymanager läuft. Wenn man sich nicht sicher ist, dann kann man mit dem Befehl docker ps sich eine Übersicht über die laufenden Container holen.
Die aktuelle force-ssl Konfig kopiert man mit dem Befehl

docker cp nginxproxymanager:/etc/nginx/conf.d/include/force-ssl.conf .

vom Container ins aktuelle Verzeichnis.
Wer mag kann eine Sicherungskopie anlegen:

cp force-ssl.conf force-ssl.conf.orig

Danach ersetzt man mit dem Texteditor seiner Wahl den Inhalt von force-ssl.conf durch folgenden Inhalt:

# Since force-ssl.conf has now moved to the server section it overrides the letsencrypt config
# which is inside a location section
# Set FORCE variable in first 2 if tests and action in the third
set $FORCE "";
if ($scheme = "http") {
        set $FORCE 'H';
}
if ($request_uri !~ "^/.well-known/acme-challenge/(.*)") {
        set $FORCE "${FORCE}D";
}
# If we are http and outside the letsencrypt directories redirect via 301
if ($FORCE = HD) {
        return 301 https://$host$request_uri;
}

Nachdem die Änderung abgespeichert ist, kopiert man die geänderte Datei zurück in den Container:

docker cp force-ssl.conf nginxproxymanager:/etc/nginx/conf.d/include

Zur Sicherheit kann man den Inhalt von force-ssl.conf nochmal anschauen:

docker exec nginxproxymanager cat /etc/nginx/conf.d/include/force-ssl.conf

Wenn alles passt, muss man den Container neustarten:

docker restart nginxproxymanager

Den Bugfix kann man mit folgendem Aufruf überprüfen:

wget http://<serveradresse>/.well-known/acme-challenge/test

Der Request wird immer mit 404 beantwortet. Erfolgt aber vorher KEIN Redirect 301 Moved Permanently auf https, ist der Bugfix korrekt eingespielt.

Obige Variante der force-ssl.conf ist der Pull Request aus dem oben genannten Ticket. IMHO müsste in der RegExp auf die URL noch der Punkt escaped werden:

if ($request_uri !~ "^/\.well-known/acme-challenge/(.*)") {

Ich persönlich verwende folgende force-ssl.conf:

set $url "${scheme}:${request_uri}";
if ($url ~ "^http:(?!/\.well-known/acme-challenge/(.*))") {
        return 301 https://$host$request_uri;
}

Hoffen wir, dass es damit keine Probleme mehr gibt.
Desweiteren bleibt zu hoffen, dass der nginxproxymanager weiter entwickelt wird und das Alarmiator Team nicht noch nach einer weiteren Realisierung für SSL suchen muss.

1 „Gefällt mir“