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
    1. environment:
    2. NETCUP_CUSTOMER_NUMBER: 'KUNDENNUMER'
    3. NETCUP_API_KEY: 'API KEY'
    4. NETCUP_API_PASSWORD: 'DAS GENERIERTE API PASSWORD'

    Ich bekomme immer folgende Fehlermeldung:

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

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

    Code
    1. 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
    1. mkdir -p /data/traefik/netcup
    2. # echo credentials and use -n to avoid newline
    3. echo -n "12345" > /data/traefik/netcup/.NETCUP_CUSTOMER_NUMBER
    4. echo -n "XYZ" > /data/traefik/netcup/.NETCUP_API_KEY
    5. echo -n "ABC" > /data/traefik/netcup/.NETCUP_API_PASSWORD
    6. 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
    1. labels:
    2. - "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
    1. Defines a default docker network to use for connections to all containers.
    2. 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^^