Hier zeige ich euch, wie ihr in Traefik 2 Wildcard (Stern) Zertifikate nutzen bzw. erstellen könnt.
Diese Anleitung setzt voraus, dass ihr bereits Traefik installiert sowie konfiguriert habt. Sollte dies nicht der Fall sein, so könnt ihr es mit dieser Anleitung tun.
1. Voraussetzungen
Bei diesem Verfahren muss euer DNS Provider mitspielen. Hier gibt es eine Liste von DNS Providern, bei denen es funktioniert.
Für jeden DNS Provider sind die Parameter etwas anders. Die genauen Parameter könnt ihr jeweils hier nachlesen. In dieser Anleitung zeige ich den Prozess am Beispiel von netcup.de.
1.1 API Key anfordern
Wenn ihr netcup als DNS Provider habt, dann könnt ihr hier nachlesen, wie ihr an euren API Key kommt.
1.2 DNS Server des Providers ermitteln
Wenn ihr bei netcup seid, dann könnt ihr hier die beiden DNS Server herausfinden.
2. Traefik Docker Compose anpassen
Ihr geht nun also in eure Docker Compose Datei von Traefik.
nano /opt/containers/traefik/docker-compose.yml
Beim Provider Netcup fügt ihr folgende Zeilen hinzu:
environment: - NETCUP_CUSTOMER_NUMBER=xxx - NETCUP_API_KEY=xxx - NETCUP_API_PASSWORD=xxxxx labels: - "traefik.http.routers.traefik-secure.tls.certresolver=netcup" - "traefik.http.routers.traefik-secure.tls.domains[0].main=euredomain.de" - "traefik.http.routers.traefik-secure.tls.domains[0].sans=*.euredomain.de"
Nachfolgend seht ihr meine komplette Docker Compose Datei. Diese setzt sich aus dieser und dieser Anleitung zusammen.
version: '3' services: traefik: image: traefik:v2.1 container_name: traefik restart: unless-stopped security_opt: - no-new-privileges:true networks: - proxy ports: - 80:80 - 443:443 volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - ./data/traefik.yml:/traefik.yml:ro - ./data/dynamic_conf.yml:/dynamic_conf.yml - ./data/acme.json:/acme.json environment: - NETCUP_CUSTOMER_NUMBER=xxx - NETCUP_API_KEY=xxxx - NETCUP_API_PASSWORD=xxx labels: - "traefik.enable=true" - "traefik.http.routers.traefik.entrypoints=http" - "traefik.http.routers.traefik.rule=Host(`traefik.euredomain.de`)" - "traefik.http.middlewares.traefik-auth.basicauth.users=user:xxxx" - "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https" - "traefik.http.routers.traefik.middlewares=traefik-https-redirect" - "traefik.http.routers.traefik-secure.entrypoints=https" - "traefik.http.routers.traefik-secure.rule=Host(`traefik.euredomain.de`)" - "traefik.http.routers.traefik-secure.middlewares=traefik-auth" - "traefik.http.routers.traefik-secure.tls=true" - "traefik.http.routers.traefik-secure.tls.certresolver=netcup" - "traefik.http.routers.traefik-secure.tls.domains[0].main=euredomain.de" - "traefik.http.routers.traefik-secure.tls.domains[0].sans=*.euredomain.de" - "traefik.http.routers.traefik-secure.service=api@internal" - "providers.file.filename=/dynamic_conf.yml" networks: proxy: external: true
Notwendige Anpassungen
- Ihr müsst unter “environment” die Parameter bezüglich eurem DNS Provider anpassen.
- Unter “labels” müsst ihr den Namen eures Providers hinschreiben
3. traefik.yml anpassen
Nun müssen wir noch die Datei traefik.yml anpassen.
nano /opt/containers/traefik/data/traefik.yml
Meine sieht so aus:
api: dashboard: true entryPoints: http: address: ":80" https: address: ":443" providers: docker: endpoint: "unix:///var/run/docker.sock" exposedByDefault: false file: filename: "/dynamic_conf.yml" certificatesResolvers: netcup: acme: email: eure@email.de storage: acme.json dnsChallenge: provider: netcup delayBeforeCheck: 900 resolvers: - "root-dns.netcup.net" - "second-dns.netcup.net"
Notwendige Anpassungen
- E-Mail Adresse anpassen
- Provider Name anpassen
- DNS Resolver eures Providers verwenden
4. Alte acme.json löschen
Nun löschen wir unsere bisherigen von Traefik erstellten Zertifikate.
rm /opt/containers/traefik/data/acme.json
Anschließend erstellen wir diese Datei wieder:
touch /opt/containers/traefik/data/acme.json chmod 600 /opt/containers/traefik/data/acme.json
5. Traefik neu starten
Traefik startet ihr wie gewohnt mit “docker-compose up” neu. Wenn ihr Traefik nun startet, sollte ein Wildcard Zertifikat erzeugt werden.
6. Testen
Ihr könnt euch bei Traefik einloggen und anschauen, welches Zertifikat Verwendet wird.
7. Bisherige Services anpassen
Wenn dies funktioniert hat, dann müsst ihr noch eure bisherigen Services anpassen. Bisher stand bei mir immer folgende Zeile in den Anleitungen:
- "traefik.http.routers.web-secure.tls.certresolver=http"
Diese Zeile müsst ihr aus den Docker Compose Dateien der anderen Dienste entfernen.
8. Quellen
https://medium.com/@containeroo/traefik-2-0-wildcard-lets-encrypt-certificates-1658370adc68
Interessant an dieser Stelle wäre vielleicht noch folgender Aspekt, wenn man in Traefik Domains mit unterschiedlicher Herkunft einrichten möchte. In meinem Fall ist das z. B.
Mein ursprünglicher Gedanke, einfach einen zweiten CertResolver unter den ersten zu hängen, ist sicherlich etwas zu kurz gedacht, oder?
Sähe dann also so aus:
Gibt es vielleicht jemanden, der es so in Verwendung hat?
Hab leider keine Testumgebung frei, sodass ich es einfach mal selbst testen kann.
Funktioniert das im Jahr 2022 noch?
Ich hab es jetzt unzählige Male versucht, reinzureichen. Mal auf Ubuntu 22.04, dann 20.04, dann auf Debian 11… nichts funktioniert.
In der ACME.JSON steht immer als letztes „Certificates: Null“. Beim Zertifikat für eine Subdomain würde da dann Key und CERT aufgelistet werden. In den DNS Einstellungen wird kurz nach dem Docker-compose up … auch der TXT für die acme_challenge angezeigt.
Dennoch scheint irgendwie kein Zertifikat abgerufen werden zu können. Safari, Firefox, Edge melden immer irgendeinen SSL-Fehler. Selbst nach dem löschen aller Browserdaten (Cookies, Verlauf usw.)
Domain(s) und Rootserver sind alle direct bei Netcup.
Daher stell ich mir grade die Frage, ob Netcup das Ganze überhaupt noch unterstützt und anbietet?
Was muss man bei:
resolvers:
– “root-dns.netcup.net”
– “second-dns.netcup.net”
eintragen wenn man seine Domain bei netcup hat?
Beim Link hab ich folgende Angaben gefunden:
Nameserver
Bitte verwenden Sie auf allen vServern folgende Nameserver zur Namensauflösung.
In den meisten Distributionen werden die Nameserver in der Datei “/etc/resolv.conf” definiert:
nameserver 46.38.225.230
nameserver 46.38.252.230
Für IPv6 verwenden Sie die folgenden Nameserver:
nameserver 2a03:4000:0:1::e1e6
nameserver 2a03:4000:8000::fce6
was davon muss nun wie oben eingesetzt werden?
Hallo,
ich bekomme partou das Wildcard-Zertifikat nicht hin. DNS-01 Challenge mit OVH. Es gibt bei der OVH zwei Wege einen Token zu bekommen. Ich habe ein Script Token mit den Rechten Get, Put, Post, Delete, leider ohne Funktion. Jemand eine Idee?
Ich bin der Meinung, dass Error 403 mein Problem lösen sollte. Hänge etwas.
traefik | time=”2021-04-14T13:40:58+02:00″ level=debug msg=”Looking for provided certificate(s) to validate [\”example.de\” \”*.example.de\”]…” providerName=ovh.acme
traefik | time=”2021-04-14T13:40:58+02:00″ level=debug msg=”Domains [\”example.de\” \”*.example.de\”] need ACME certificates generation for domains \”example.de,*.example.de\”.” providerName=ovh.acme
traefik | time=”2021-04-14T13:40:58+02:00″ level=debug msg=”Loading ACME certificates [example.de *.example.de]…” providerName=ovh.acme
traefik | time=”2021-04-14T13:40:58+02:00″ level=debug msg=”Building ACME client…” providerName=ovh.acme
traefik | time=”2021-04-14T13:40:58+02:00″ level=debug msg=”https://acme-v02.api.letsencrypt.org/directory” providerName=ovh.acme
traefik | time=”2021-04-14T13:40:59+02:00″ level=debug msg=”Using DNS Challenge provider: ovh” providerName=ovh.acme
traefik | time=”2021-04-14T13:40:59+02:00″ level=debug msg=”legolog: [INFO] [example.de, *.example.de] acme: Obtaining bundled SAN certificate”
traefik | time=”2021-04-14T13:41:00+02:00″ level=debug msg=”legolog: [INFO] [*.example.de] AuthURL: https://acme-v02.api.letsencrypt.org/acme/authz-v3/12328117735”
traefik | time=”2021-04-14T13:41:00+02:00″ level=debug msg=”legolog: [INFO] [example.de] AuthURL: https://acme-v02.api.letsencrypt.org/acme/authz-v3/12328117737”
traefik | time=”2021-04-14T13:41:00+02:00″ level=debug msg=”legolog: [INFO] [*.example.de] acme: use dns-01 solver”
traefik | time=”2021-04-14T13:41:00+02:00″ level=debug msg=”legolog: [INFO] [example.de] acme: Could not find solver for: tls-alpn-01″
traefik | time=”2021-04-14T13:41:00+02:00″ level=debug msg=”legolog: [INFO] [example.de] acme: Could not find solver for: http-01″
traefik | time=”2021-04-14T13:41:00+02:00″ level=debug msg=”legolog: [INFO] [example.de] acme: use dns-01 solver”
traefik | time=”2021-04-14T13:41:00+02:00″ level=debug msg=”legolog: [INFO] [*.example.de] acme: Preparing to solve DNS-01″
traefik | time=”2021-04-14T13:41:00+02:00″ level=debug msg=”legolog: [INFO] [example.de] acme: Preparing to solve DNS-01″
traefik | time=”2021-04-14T13:41:00+02:00″ level=debug msg=”legolog: [INFO] [*.example.de] acme: Cleaning DNS-01 challenge”
traefik | time=”2021-04-14T13:41:00+02:00″ level=debug msg=”legolog: [WARN] [*.example.de] acme: cleaning up failed: ovh: unknown record ID for ‘_acme-challenge.example.de.’ ”
traefik | time=”2021-04-14T13:41:00+02:00″ level=debug msg=”legolog: [INFO] [example.de] acme: Cleaning DNS-01 challenge”
traefik | time=”2021-04-14T13:41:00+02:00″ level=debug msg=”legolog: [WARN] [example.de] acme: cleaning up failed: ovh: unknown record ID for ‘_acme-challenge.example.de.’ ”
traefik | time=”2021-04-14T13:41:00+02:00″ level=debug msg=”legolog: [INFO] Deactivating auth: https://acme-v02.api.letsencrypt.org/acme/authz-v3/12328117735”
traefik | time=”2021-04-14T13:41:01+02:00″ level=debug msg=”legolog: [INFO] Deactivating auth: https://acme-v02.api.letsencrypt.org/acme/authz-v3/12328117737”
traefik | time=”2021-04-14T13:41:01+02:00″ level=error msg=”Unable to obtain ACME certificate for domains \”example.de,*.example.de\” : unable to generate a certificate for the domains [example.de *.example.de]: error: one or more domains had a problem:\n[*.example.de] [*.example.de] acme: error presenting token: ovh: error when call api to add record (/domain/zone/example.de/record): Error 403: \”This call has not been granted\”\n[example.de] [example.de] acme: error presenting token: ovh: error when call api to add record (/domain/zone/example.de/record): Error 403: \”This call has not been granted\”\n” providerName=ovh.acme
Erstmal vielen Dank für die ausführlichen Anleitungen.
In meiner Konfiguration kommen zwei verschiedene Anbieter für die Domains zum Einsatz, namecheap und netcup. Wenn ich es richtig verstehe, muss ich zwei resolver anlegen. Aber wie ordne ich die jeweiligen Domains in der traefik config den richtigen resolver zu?
Später sollen Domains beider resolver zumindest für Webmail per Mailcow gemeinsam zum Einsatz kommen. Reicht es weiterhin aus, den bestehenden http-Resolver aus den docker-compose.yml Dateien zu entfernen?
Alle drei Traefik Anleitungen sind sehr hilfreich, danke dir!
Kann ich das auch mit einem schon vorhandenen wildcard Zertifikat nutzen? Wenn ja, wie?
Ich versuche das ganze auf einer Diskstation bei mir zum Laufen zu bringen.
Den traefik Container bekomme ich soweit zum laufen und ich kann mit netcup ccp auch sehen
das “_acme-challenge” angelegt werden.
Beim Zugriff auf die Weboberfläche von traefik wird jedoch immer ein default-Zertifikat verwendet.
Nachdem ich das Logging aktiviert habe finde ich den folgenden Fehler in den Logs. Was mache ich falsch?
time=”2021-02-07T20:59:15+01:00″ level=debug msg=”legolog: [INFO] retry due to: acme: error: 400 :: POST :: https://acme-v02.api.letsencrypt.org/acme/chall-v3/10684255354/xkQnqA :: urn:ietf:params:acme:error:badNonce :: JWS has an invalid anti-replay nonce: \”0103552E3mKhR5BvfC7zIVrCwZ0PyXPSG3XgnEBPAHUWhy0\”, url: ”
time=”2021-02-07T20:59:22+01:00″ level=debug msg=”legolog: [INFO] [*.MEINE-DOMAIN.de] The server validated our request”
time=”2021-02-07T20:59:23+01:00″ level=debug msg=”legolog: [INFO] [MEINE-DOMAIN.de] acme: Trying to solve DNS-01″
Ich nutze aktuell deine Tutorials um mir das ganze Grundlegend einzurichten. Meine Reihenfolge war:
1. Docker & Compose installieren
2. Traefik installieren
3. HTTP Challenge auf DNS Challenge mit Hetzner Provider
Hierbei bin ich beim starten des Containers auf folgenden Fehler getreten:
“the router traefik-secure@docker uses a non-existent resolver: hetzner”
Allerdings ist die Environment Variable für den API gesetzt, der http Resolver wurde auf hetzner geändert und in der traefik.toml hab ich ebenfalls die Daten alle angepasst.
Anschließend hab ich den Container gestoppt, die acme.json gelöscht, neu erstellt und die Permissions vergeben.
Beim Starten an dieser Stelle ist der Fehler aufgetreten.
Ich verweise auf folgendes GitHub Issue, was deinen Schritt mit dem löschen der acme.json das Setup unbrauchbar macht:
https://github.com/traefik/traefik/issues/7414
Hast du da zufällig ‘ne Lösung parat? 😀
Würde das auch funktionieren, wenn man keine eigene Domain hat, sondern eine von Netcup bereitgestellte Subdomain (xxxxxxxx.happysrv.de)? Ich erhalte da immer entsprechende Fehlermeldung, weil ich nicht Besitzer dieser Domain (happysrv.de) bin. Wie kann ich mittels Traefik verschlüsseln?
Hey Christian,
top Anleitung, konnte ich gut als Grundlage nehmen.
Vielen Dank dafür.
Beste Grüße
Felix
Hallo Christian,
irgendwie will es nicht funktionieren mit Wildcard (Stern) Zertifikaten. Nutze ebenso netcup und die von dir beschriebene Standardvariante plus HTTPS-Verschlüsselung verbessern funktioniert einwandfrei. Wenn jetzt die oben beschrieben Anpassungen gemacht werden erscheint beim aufrufen von Traefik:
– SSL_ERROR_INTERNAL_ERROR_ALERT
Habe dann Treafik mal komplett gelöscht und nochmal nach o.g. Anleitung installiert ohne die dynamic_conf.yml zu definieren. Zugriff auf Traefik, Jitsi, WordPress etc gelingt, allerdings kommt unter Error code: MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT.
Hast du eine Idee woran das liegen könnte? Wie ist deine dynamic_conf.yml konfiguriert?
Hallo,
vielen Dank für den Artikel. Nach Anregung der ct’ habe ich heute versucht, ein Wildcard-Zertifikat einzurichten. Mein Server wird von Netcup gehostet, daher hat mir Ihr Artikel sehr weitergeholfen.
Allerdings hat es nicht geklappt. Haben Sie einen Domain-Reseller-Vertrag mit Netcup abgeschlossen? Ich habe gelesen, dass das Voraussetzung zu Nutzung der API ist.