Traefik Letsencrypt Wildcard-Zertifikate

  • Hallo zusammen,


    ich habe hier bei netcup drei Domains. Für eine davon wollte ich unter Docker Swarm in Traefik mit Letsencrypt mit der DNS-01 Challenge ein Wildcard-Zertifikat ausstellen lassen.


    Meine Einstellungen in der .toml:

    Und unterhalb der docker-compose.yml unterhalb des Traefik-Services:

    Code
    environment:
    NETCUP_CUSTOMER_NUMBER: 'KUNDENNUMER'
    NETCUP_API_KEY: 'API KEY'
    NETCUP_API_PASSWORD: 'DAS GENERIERTE API PASSWORD'

    Ich bekomme immer folgende Fehlermeldung:

    Code
    time="2019-05-16T18:05:37Z" level=error msg="Error getting ACME certificate for domain [\"*.mein-donain.de\"]: cannot obtain certificates: acme: Error -> One or more domains had a problem:\n[*.meine-domain.de] [*.meine-domain.de] acme: error presenting token: netcup: failed to find DNSZone, unexpected response code 'REFUSED' for _acme-challenge.meine-domain.de.\n"


    Jetzt ist mir nicht klar, ob Traefik einfach nur falsch konfiguriert ist oder es eine Problem mit dem Netcup DNS oder dort vorhandene Einstellungen ist.


    Weiß hier jemand woran es liegt, bzw. hat es schon mal jemand erfolgreich zum Laufen gebraucht?

  • Das Problem war wohl selbst erzeugt in der .toml Datei:

    Code
    resolvers = ["46.38.225.230:53","46.38.252.230"]

    Ohne diese Zeile wird der _acme-challenge TXT-Eintrag erzeugt.


    Ich vermute mal das Problem hat sich damit erledigt.

  • Jetzt wo das Ausstellen der Zertifikate klappt ist heir auch gleich die zweite schlechte Idee die ich hatte in der .toml Datei:

    Code
    caServer = "https://acme-staging-v02.api.letsencrypt.org/directory"

    Damit bekommt man nur Zertifikate, die von der Letsencrypt Staging-Umgebung ausgestellt werden.


    Richtig ist:

    caServer = "https://acme-v02.api.letsencrypt.org/directory"

  • Achja, noch ein wichtiger Aspekt: was noch gefehlt hat war Geduld!


    Die Einstellung `delayBeforeCheck = 900` in der .toml-Datei sorgt dafür, dass erst nach 15 Minuten der TXT-Eintrag für "_acme-challenge" überprüft wird.

    Es dauert tatsächlich so seine Zeit bis der Eintrag zu sehen ist. Nach einiger Zeit verschwindet er auch wieder.

  • Hallo Metin,

    vielen Dank für das Teilen der Konfiguration, es hat bei mir auch super funktioniert :)


    Als Ergänzung noch:

    Man kann anstelle der Umgebungsvariablen auch Dateien nutzen, in die man die Credentials hinterlegt. Das hat bei mir so funktioniert:


    docker-compose.yml



    Und die Credentials sollte man mit echo -n schreiben, damit newlines vermieden werden (damit kommt Traefik nicht klar)

    Code
    mkdir -p /data/traefik/netcup
    # echo credentials and use -n to avoid newline
    echo -n "12345" > /data/traefik/netcup/.NETCUP_CUSTOMER_NUMBER
    echo -n "XYZ" > /data/traefik/netcup/.NETCUP_API_KEY
    echo -n "ABC" > /data/traefik/netcup/.NETCUP_API_PASSWORD
    chmod -R 400 /data/traefik/netcup/



    traefik.toml

  • Danke für die Ergänzung!


    Wobei ich es eher als Geschmackssache empfinde, ob man die Credentials direkt in der compose.yml oder indirekt aus einer Datei einbindet.


    Bei mir läuft Traefik auf einem 3 Knoten Swarm-Cluster im "Global modus" (-> eine Instanz je Node) und die TLS-Zertifikate werden in einem 3 Knoten Consul-Cluster (automatisch) abgelegt. Hier könnte man "Secrets" verwenden um die "Credential-Datein" im Cluster zu verteilen.


    Demnächst sollte Treafik v2 rauskommen:

    - geänderte Konfiguration

    - zusätzlich zu Layer7 (http/https) beherrscht es nun auch Layer4 (tcp)


    Sobald es "stable" ist aktuallisiere ich hier mal die Konfiguration :)

  • Ich habe das ganze mit der V2 so zum laufen bekommen:

    Was ich leider nicht zum laufen bekomme dahinter ist Mailcow. Hat hier jemand eine funktionierende Konfiguration?

  • Was genau funktionert denn nicht? Welche Labels hast du denn den Mailcow Containern gegeben? Was mir oben direkt auffällt: Es fehlen die Ports / Services. Z.B.


    Code
    labels:
      - "traefik.http.services.my-app.loadbalancer.server.port=80"

    Halt für jeden "Service", der über Traefik geroutet werden soll, einen eigenen. Aber jeder Container muss halt entsprechend gelabelt werden. Was hast du denn bisher genau gemacht?

  • Es fehlen die Ports

    Ich bin davon ausgegangen, dass Traefik eigentlich sich die Ports selbst raussuchen würde. Müsste diese ja eigentlich über Docker raus bekommen.

    (der whoami Container hat auch Problemlos funktioniert).


    Ich hab das dann so probiert:

    In das Verzeichnis, wo die docker-compose.yml Datei liegt diese erstellt: docker-compose.override.yml

    Hier hab ich sogar das mit dem Port probiert, hat aber auch nichts gebracht.

    Hab wo gelesen, dass man das Netzwerk von der Cow mit geben soll, aber hat auch keinen Effekt.


    Endet immer in "gateway timeout" und es kommt nichts bei MailCow an...

  • Läuft denn Traefik im gleichen Docker Netzwerk wie der Mailcow Container? Ich löse das ja immer über ein eigenes "Gateway Netzwerk", in dem dann beide Container laufen. Und ja, den Port muss man eigentlich angeben. Ohne hat es bei mir noch nie funktioniert.


    (so läuft das bei mir, allerdings in einem Docker Swarm. Müsste aber für Docker native im Grunde genauso funktionieren)

  • Und ja, den Port muss man eigentlich angeben.

    Er hat aber laut dem Dashboard immer die richtigen Ports rausgesucht. Aber auch mit der Angabe vom Port bin ich noch bei Gateway Timeout.

    Unter den Guides ist das mit dem Port auch nirgendwo beschrieben (https://docs.traefik.io/user-guides/docker-compose/acme-dns/)

    Läuft denn Traefik im gleichen Docker Netzwerk wie der Mailcow Container?

    Nein, Mailcow erstellt sich ja immer selbst eines.

    Deswegen habe ich es ja auch mit "traefik.docker.network=mailcowdockerized_mailcow-network" probiert.

    Code
    Defines a default docker network to use for connections to all containers.
    
    This option can be overridden on a container basis with the traefik.docker.network label.


    Nen normalen Docker-Container mit nem Apache oder so bekomme ich Problemlos dahinter zum laufen. Nur die Mailkuh nicht :(

    Wahrscheinlich nur ne Kleinigkeit, wo ich auf dem Schlauch stehe mal wieder.


    Aber danke für deine Hilfe Versuche Paul werde dann jetzt wohl acme.sh zum erstellen der Zertifikate und Apache als Proxy benützen- Das läuft Momentan wenigstens so wie ich will^^

  • nitram


    Falls du es noch immer nicht hin bekommen hast, du musst traefik und die Cow in ein gleiches Netzwerk packen (ggf. ein zusätzliches!), deswegen gibt es ja so viele guides, wo es ein "traefik_XY" Netzwerk gibt.

    Du musst das lediglich oben wie Paul machen, das geht auch ohne Swarm.

    Deine Cow befindet sich dann halt in zwei Netzwerken - ggf musst du hier nur das default Interface definieren.

  • Ich habe mich auch eben an dem Tutorial versucht mit Traefik V2

    Code
     time="2020-09-26T13:28:49Z" level=error msg="Unable to obtain ACME certificate for domains \"git.farsity.de\": unable to generate a certificate for the domains [git.farsity.de]: error: one or more domains had a problem:\n[git.farsity.de] [git.farsity.de] acme: 
    error presenting token: netcup: 
    loging error: an error occurred during the action login: 
    [Status=error, StatusCode=4014, 
    ShortMessage=Api key is invalid, 
    LongMessage=For this user the provided API key is not valid.]\n" providerName=leresolver.acme routerName=git@docker rule="Host(`git.farsity.de`)"

    Dann habe ich beim Anlegen des API-Keys "Um auf dem API Domainfunktionen zu nutzen, schließen sie bitte einen Domainresellervertrag mit uns." bemerkt.


    Ist die DNS-01 Validierung als Domainfunktion auf der API zu werten?

  • Guten Tag,


    ich versuche auch über traefik ein Wildcard-Zertifikat zu holen. Der traefik-Container läuft auf einem Server bei mir zu Hause.

    Wenn ich jetzt alles soweit einrichte werden auch die DNS Einträge _acme-challenge angelegt.
    In den Logs von traefik taucht die folgende Meldung (siehe unten) auf und wenn ich das traefik Dashboard aufrufe wird das Zertfikat zwar im Dashboard

    angezeigt aber es wird nicht verwendet (Die Seite verwendet ein selbst signiertes Zertifikat von traefik)


    Code
    [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: "