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
        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

Teile diesen Beitrag
Christian

Categories:

19 Kommentare

  1. 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.

    • Hallo,
      ich bin ein „normaler“ Kunde. Habe keine Verträge zu netcup oder sonstiges.

      Müsste über das Netcup CPP gehen. Link zur Netcup CCP Anleitung befindet sich im Artikel.

      LG
      Christian

      • Hallo,
        die Api von Netcup funktioniert wohl, ich finde anschließend Texteinträge im DNS. In die Datei acme.json werden ebenfalls Einträge vorgenommen, das Zertifikat wird aber leider nicht eingetragen. Ich habe es jetzt aufgegeben, das Anlegen einzelner Zertifikate funktioniert sehr gut und reicht mir auch.
        Vielen Dank für die sehr informative Website mit vielen hilfreichen Tipps, einiges davon habe ich bereits nutzen können.
        LG
        Walter

        • Bei mir hat es geholfen einen Delay im acme check hinzuzufügen da die DNS Server von Netcup wohl zu langsam sind. In der traefik.yml einfach ein delayBeforeCheck einfügen.

          provider: netcup
          delayBeforeCheck: 900
          resolvers:

          • Ich habe auch ein paar Versuche gebraucht und ich benutze auch Netcup.

            u.a. hatte ich diesen Fehler

            „`
            level=error msg=“Unable to obtain ACME certificate for domains \“example.com,*.example.com\“ : unable to generate a certificate for the domains [example.com *.example.com]: error: one or more domains had
            a problem:\n[*.example.com] time limit exceeded: last error: read udp y.y.y.y:60917->x.x.x.x:53: i/o timeout\n“ providerName=netcup.acme
            „`

            (Domain durch example.com und IP durch x.x.x.x und y.y.y.y ausgetauscht )

            Das hier ist meine Konfiguration (traefik.yml), die jetzt funktioniert

            „`
            api:
            dashboard: true
            accessLog:
            fields:
            names:
            StartUTC: drop
            entryPoints:
            webinsecure:
            address: „:80“
            http:
            redirections:
            entryPoint:
            to: web
            scheme: https
            priority: 1999999999
            web:
            address: „:443“
            http:
            middlewares:

            tls:
            certresolver: netcup
            domains:
            – main: „*.example.com“
            sans:
            – „example.com“
            log:
            level: INFO
            providers:
            docker:
            exposedByDefault: false
            network: border-traefik-network
            swarmMode: true
            defaultRule: „Host(`{{ index .Labels \“bordertraefik.host\“}}.example.com`)“
            constraints: „LabelRegex(`bordertraefik.host`,`.+`)“
            file:
            filename: „/file-provider.yml“

            certificatesResolvers:
            netcup:
            acme:
            email: „me@example.com“
            storage: „/data/acme.json“
            dnsChallenge:
            provider: netcup
            delayBeforeCheck: 900

            „`

            Auf jeden Fall wichtig ist „delayBeforeCheck: 900“, weil die DNS Sever etwas Zeit brauchen, bis sie den neuen DNS TXT Record ausgeben.
            Ich weiß nicht, ob es wichtig ist, aber bei mir hatte es funktioniert, nachdem ich main und sans vertauscht habe. Also main = „*.example.com“ und sans = „example.com“

  2. 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,
        ich laufe auf den selben Fehler.
        Es liegt aber meines Wissens nach nicht an der dynamic_conf.yml.
        Der Fehler „MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT“ kommt, da er ein default Traefik Zertifikat verwendet und dies nicht von Mozilla angenommen wird.

        Die Zertifikate setzt er bei mir ein, da er anscheinend nicht mit der API kommunizieren kann oder meine Domain nicht gefunden wird. Leider ferstehe ich nicht ganz was die nachfolgende meldung mir sagen möchte.

        Unable to obtain ACME certificate for domains \“default.de,*.default.de\“ : unable to generate a certificate for the domains [default.de *.default.de]: error: one or more domains had a problem:\n[*.default.de] [*.default.de] acme: error presenting token: netcup: failed to find DNSZone, unexpected response code ‚REFUSED‘ for _acme-challenge.default.de.\n[default.de] [default.de] acme: error presenting token: netcup: failed to find DNSZone, unexpected response code ‚REFUSED‘ for _acme-challenge.default.de.\n“ providerName=netcup.acme

        Vieleicht weiß hier einer was bei mir der Fehler ist.
        Meine Domain habe ich bei Netcup gekauft, aber meine Server betreibe ich selber.

  3. 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?

  4. 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? 😀

    • Ebenfalls würde mich interessieren wo plötzlich bei dir in der docker-compose.yml folgendes herkommt:
      […]
      – „providers.file.filename=/dynamic_conf.yml“
      […]
      – ./data/dynamic_conf.yml:/dynamic_conf.yml
      […]

      Und in der traefik.toml:
      […]
      file:
      filename: „/dynamic_conf.yml“
      […]

      Dies kommt im vorherigen Setup nicht vor und wird auch nirgends erwähnt.

    • und bezüglich folgender Zeilen:
      […]
      – „traefik.http.routers.traefik-secure.tls.domains[0].main=euredomain.de“
      – „traefik.http.routers.traefik-secure.tls.domains[0].sans=*.euredomain.de“
      […]

      Hier wähle ich dann ja die Domain die ich quasi als Host nutze? Wenn also der hostname des Servers srv01.domain.tld ist nutze ich hier domain.tld und *.domain.tld? Inwiefern beeinflusst dies später die Konfiguration von mailcow welches sich ja die Zertifikate selber zieht? Und wie sieht es mit weiteren Domains aus, welche in mailcow konfiguriert sind (Multi Domain Setup)? Denn dort muss ich ja die SANS alle angeben, die im Zertifikat enthalten sein sollen, also z.B. *.domain.tld, *.domain2.tld, *.domain3.tld

    • – „traefik.http.routers.web-secure.tls.certresolver=http“ entfernen dann neustarten.
      Hat bei mir problemlos funktionert.

      Hatte auch die ganze Zeit Fehler.

  5. 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″

  6. 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?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.