Nginx: Letsencrypt Zertifikat lässt sich nicht erstellen

Hallo, ich habe eine Problemchen:

Ich habe einige Dienste in Docker auf einem Raspberry Pi eingerichtet. Dazu einen Dyndns-Account bei IPV64.de. Mit einem Nginx-Container kann ich nun von aussen auf einen Container zugreifen. Funktioniert über http tadellos. Sobald ich aber in Nginx ein Letsencrypt-Zertifikat erstellen möchte, erhalte ich einen Fehler und im Log vom Nginx steht dazu folgendes:

An unexpected error occurred: requests.exceptions.ConnectionError: HTTPSConnectionPool(host='acme-v02.api.letsencrypt.org', port=443): Max retries exceeded with url: /directory (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7fada425d0>: Failed to resolve 'acme-v02.api.letsencrypt.org' ([Errno -3] Temporary failure in name resolution)")) Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /tmp/letsencrypt-log/letsencrypt.log or re-run Certbot with -v for more details.

Hat da jemand einen guten Tipp? Oder welche zusätzlichen Infos soll ich liefern? Ich bedanke mich schon mal!

Die Fehlermeldung lässt darauf schließen, dass der Nginx Container kein Zugriff ins Internet hat. Weil ansonsten könnte certbot den FQDN acme-v02.api.letsencrypt.org auflösen.

Kommt dein Nginx Proxy Manager ins Internet?
Wenn du auf dem Container des NPM drauf bist, führe einfach mal den Befehl aus:

curl -I https://acme-v02.api.letsencrypt.org/

Daraufhin sollte eine Antwort der Webseite kommen.
image

Tatsächlich bekomme ich hier eine Fehlermeldung:

[root@docker-9bd0d193d1d5:/app]# curl -I https://acme-v02.api.letsencrypt.org/
curl: (6) Could not resolve host: acme-v02.api.letsencrypt.org

Dabei meine ich, alles gemäss den Videos von Dennis (die ich übrigens alle mega gut finde!) gemacht. Habe keine Ahnung, was da bei mir falsch sein könnte, dass der nginx nicht ins Internet kommt…

Hast du ein DNS Blocker in deinem Netzwerk aktiv? (z.B. Pihole oder Adguard)

Ja, es läuft ein Pihole, ebenfalls unter Docker. Habe es mal für 5 Minuten disabled. Trotzdem leider der gleiche Fehler. Der Nginx hat keine Internetverbindung. Was kann ich noch unternehmen?

Was stehen denn bei dir für DNS Server im RPI bzw. im Container des NPM?

cat /etc/resolv.conf

Hatte das Problem selbst auch schon, dass im Container falsche DNS Server gesetzt waren und somit keine Verbindung aufgebaut werden konnte.

Das ist die Ausgabe der resolv.conf:

[root@docker-9bd0d193d1d5:/app]# cat /etc/resolv.conf
# Generated by NetworkManager
search fritz.box
nameserver 192.168.24.12
[root@docker-9bd0d193d1d5:/app]# 

Die IP-Adresse ist die des Raspi, auf dem Docker mit den Containern läuft.

Wie kommst du darauf, dass er NPM einsetzt? Ich lese das nicht aus der Frage heraus. Habe ich was überlesen?

Von welchen Video sprichst du? Bitte einmal Link posten.

Das hat er hier geschrieben.

Reverse Proxy - Erklärung und Installation
Einrichtung und Lets Encrypt

Aktuell wird aber auf der Homepage des npm ein docker compose file angeboten, in dem statt der MariaDB mit SQLite gearbeitet wird. Habe diese aktuellen Einstellungen genommen:
npm - quick setup

Setze mal bitte deinen DNS Server des Hostsystem (RPI) auf einen öffentlichen DNS Server. Hatte nämlich das gleiche Problem, wenn der Pi sich selbst als DNS drin stehen hatte, was dann entsprechend an die Docker Container weitergegeben wird, hat das ganze ebenfalls nicht funktioniert. Es ist vielleicht nicht die Best Practice Lösung, aber hat bei mir funktioniert gehabt.

Zuvor muss du auf deinem RaspberryPi die NetworkManager.conf anpassen, da bei einem Neustart die resolv.conf überschrieben wird.

Diese liegt unter /etc/NetworkManager/NetworkManager.conf
Dort muss der Punkt dns=none hinzugefügt werden.
image

Anschließend kannst du in der resolv.conf die öffentlichen Nameserver setzen.

z.B:
image

Danach den Pi neu starten und erneut auf dem NPM Container den Curl Befehl ausführen.

curl -I https://acme-v02.api.letsencrypt.org/

Um das ganze wieder rückgängig zu machen, einfach in der NetworkManager.conf den Eintrag: dns=none raus nehmen und den Pi neu starten. Dann zieht der Pi sich die DNS Config wieder von deinem Router.

Yippie Yeah - es funktioniert! Konnte schon Zertifikate anlegen und die Verbindungen sind jetzt verschlüsselt. Ganz ganz vielen herzlichen Dank Dir!

LG Harald

Hallo zusammen,

da ich vor demselben Problem stehe wie @hase24 bin ich über Google auf dieses Forum gestoßen. PiHole sowie NPM laufen auf dem gleichen Host (Debian Server 12) und der NPM kann sich keine Zertifikate holen. Jetzt wollte ich deine beschriebene Lösung testen, kann aber die NetworkManager.conf bei mir nicht finden, die Datei ist nicht vorhanden.
In der resolv.conf vom Debian (Host) steht folgendes:

domain fritz.box
search fritz.box
nameserver 192.168.178.152

PiHole: resolv.conf

# Generated by Docker Engine.
# This file can be edited; Docker Engine will not make further changes once it
# has been modified.

nameserver 127.0.0.11
search fritz.box
options ndots:0

# Based on host file: '/etc/resolv.conf' (internal resolver)
# ExtServers: [192.168.178.1]
# Overrides: []
# Option ndots from: internal

NPM: resolv.conf

# Generated by Docker Engine.
# This file can be edited; Docker Engine will not make further changes once it
# has been modified.

nameserver 127.0.0.11
search fritz.box
options ndots:0

# Based on host file: '/etc/resolv.conf' (internal resolver)
# ExtServers: [192.168.178.152]
# Overrides: []
# Option ndots from: internal

Bin für jede Hilfe Dankbar…

@Neo3477 - Wenn deine resolv.conf des Hosts nicht vom NetworkManager verwaltet wird, dann kannst du dort eigentlich direkt die neuen Nameserver eintragen. Dann reboot und erneut testen.

Nach einem Neustart stand wieder der alte nameserver drinnen :thinking:, also die 192.168.178.152.
Was, wenn ich das richtig verstehe, auch so sein sollte da ja der PiHole den DNS machen soll und der so an der Fritzbox eingetragen ist.

@Neo3477 - Ok, der DNS Server wird über die FRITZ!Box an deine Clients verteilt…Beim Pi mit Docker usw. hab ich schlechte Erfahrungen damit gemacht, wenn dort kein öffentlicher DNS Server drin steht. (Wie hier bereits beschrieben)

Würde bei dir der NetworkManager laufen, wäre der Weg hier bereits beschrieben. Du musst den PI dazu bringen, sich die DNS Settings nicht von der FRITZ!Box überschreiben zu lassen. Dann kannst du die resolv.conf nach deinen Vorlieben anpassen. Ohne NetworkManager müsste ich dies selbst erstmal recherchieren.

Was wäre den Best Practice um beides (PiHole und NPM) zusammen vernünftig zum laufen zu bekommen? Da auf dem Server aktuell sonst nichts weiter läuft, außer noch Portainer, ist das ganze ja schnell aufgesetzt. Aktuell, wie gesagt, alles auf einem Debian Server der auf einem NUC läuft. Ich hätte aber auch noch eine Synology wo ich wenn nötig einen der Container auslagern könnte, wenn das besser ist. Oder den NetworkManager nachträglich installieren…?