Für meinen Heimserver setzte ich seit einer Weile Docker ein. Um auch die heimischen Dienste mittels HTTPS abzusichern, soll Let’s Encrypt zum Einsatz kommen. Da die Webserver aber nicht öffentlich erreichbar sind, muss zur Bestätigung der Zertifikate das Verfahren DNS-01 zum Einsatz kommen. Ich habe meine Domains inzwischen bei OVH, da diese eine ordentliche API zur DNS-Verwaltung anbieten – was Grundvoraussetzung für DNS-01 ist.

Als Webserver bzw. Reverse-Proxy setze ich Traefik ein – dieser kann Docker-Container anhand von Tags über Domains verfügbar machen und auch gleich Let’s Encrypt Zertifikate ausstellen.

OVH als DNS-Provider wird von Traefik unterstützt. Das Setup möchte ich hier vorstellen.

OVH-Keys erzeugen

Um auf die OVH-API zugreifen zu können, müssen zunächst ein Consumer-Key, ein Application-Key sowie ein Application-Secret erzeugt werden. Dazu gibt es verschiedene Varianten. Die einfachste Möglichkeit ist das Web-Tool von OVH: https://api.ovh.com/createToken/.

Um das Missbrauchspotential des Schlüssels im Verlustfall zu minimieren, sollten nur die absolut notwendigen Berechtigungen dafür vergeben werden. Im Zweifel kann man sich kostenlos eine Zone für eine Subdomain anlegen und den Zugriff auf diese beschränken. Dies geht auch für Domains, welche nicht bei OVH gehostet sind.

Name und Beschreibung des Keys sind frei wählbar, der Name muss jedoch pro Account eindeutig sein. Als Dauer sollte man „unlimited“ auswählen, sonst funktioniert die Zertifikats-Erneuerung irgendwann nicht mehr. Die folgenden Berechtigungen werden benötigt (der Platzhalter „{zone}“ steht für die jeweilige Domain):

  • GET /domain/zone/{zoneName}/record – DNS-Records auflisten
  • GET /domain/zone/{zoneName}/record/* – DNS-Records anzeigen
  • POST /domain/zone/{zoneName}/record – DNS-Record anlegen
  • DELETE /domain/zone/{zoneName}/record/* – DNS-Records löschen
  • POST  /domain/zone/{zoneName}/refresh – Änderungen wirksam machen

So sieht das Ergebnis dann aus:

Hat man sich vertan, kann man einen Key auch wieder löschen. Dies geht allerdings nur über den API-Explorer auf https://api.ovh.com/console/#/me/api/application#GET

 

Traefik via Docker-Compose ausführen

Mit dem folgenden Compose-File kann man den Trafic-Dienst starten:

version: "3"
services:
  traefik:
    image: traefik:1.6
    command: |
      -c /dev/null
      --api
      --logLevel=INFO
      --insecureskipverify
      --docker
      --docker.domain=docker.localhost
      --docker.exposedbydefault=false
      --entryPoints='Name:http Address::80 Redirect.EntryPoint:https'
      --entryPoints='Name:https Address::443 TLS Compress:true'
      --defaultentrypoints=http,https
      --acme
      --acme.onHostRule=true
      --acme.email=""
      --acme.storage=/data/acme.json
      --acme.entryPoint=https
      --acme.dnsChallenge.provider=ovh
    dns:
      - 8.8.8.8
    environment:
      OVH_ENDPOINT: ovh-eu
      OVH_APPLICATION_KEY: [...]
      OVH_APPLICATION_SECRET: [...]
      OVH_CONSUMER_KEY: [..]
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./traefik:/data
      - /var/run/docker.sock:/var/run/docker.sock
    restart: unless-stopped

Die Option „insecureskipverify“ ermöglich, lokale Dienste mit ungültigem SSL-Zertifikat anzusprechen. Die Option „dns: 8.8.8.8“ kann in manchen Umgebungen notwenig sein, da die Zertifikatserstellung sonst mit „Could not find the start of authority“ abbricht.

Einen Test-Service deployen

Auch dies kann per Docker-Compose erfolgen. Es ist sinnvoll, vorher den Traefik logLevel auf DEBUG zu schalten.

version: "3"
services:
  nginx:
    image: nginx
    labels:
      traefik.enable: true
      traefik.port: 80
      traefik.frontend.rule: "Host:le-test.mydomain.com"

Durch das Label „traefik.enable“ wird traefik für diesen Container aktiviert. „traefik.port“ gibt an, welcher Port nach außen gegeben werden soll. Die „traefik.frontend.rule“ gibt die Domain an, unter der der Dienst ereichbar sein soll. Für diese wird, wenn alles korrekt konfiguriert ist, ein Zertifikat erzeugt.

Schreibe einen Kommentar

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

*

code