Table des matières

, , , ,

Traefik: configuration de let's encrypt

Traefik peut gérer les certificats Let's Encrypt au profit des services placés derrière le reverse-proxy.

Configuration statique

Pour les tests la configuration statique peut déclarer le résolveur comme suit (avec une autorité de certification “staging”):

certificatesResolvers:
  resolver-letsencrypt-testing:
    acme:
      caServer: https://acme-staging-v02.api.letsencrypt.org/directory
      email: contact@example.com
      storage: /etc/traefik/acme/cert_testing_storage.json
      httpChallenge:
        entryPoint: HTTP

Pour la production, utiliser le paramétrage suivant pour le résolveur

certificatesResolvers:
  resolver-letsencrypt:
    acme:
      caServer: https://acme-v02.api.letsencrypt.org/directory
      email: contact@fqdn.
      storage: /etc/traefik/acme/cert_storage.json
      httpChallenge:
        entryPoint: HTTP

docker-compose

Le fichier de configuration statique définit un fichier de stockage au format JSON (dans mon cas /etc/traefik/acme/cert_storage.json). Pour pouvoir conserver son contenu on crée un point de montage dans la déclaration du service au sein du docker-compose

version: "3.3"

services:
  traefik:
    image: traefik:v2.4.12
    restart: unless-stopped
    ...  

    volumes:
      # Traefik écoute l'orchestrateur local Docker via le mapping suivant
      - type: bind
        source: /var/run/docker.sock
        target: /var/run/docker.sock
        read_only: true
      # Fichier de configuration statique en lecture seule
      - type: bind
        source: $PWD/traefik/conf/traefik.yml
        target: /etc/traefik/traefik.yml
        read_only: true
      # fichier de stockage des certificats letsencrypt
      # NB: doit appartenir a root avec les droits acces 600
      - type: bind
        source: $PWD/traefik/certs/letsencrypt
        target: /etc/traefik/acme
    ...

Les fichiers de stockage des certificats doivent appartenir à root et avoir les droits positionnés à 0600.

$ mkdir -p traefik/certs/letsencrypt
$ cd traefik/certs/letsencrypt
$ touch cert_testing_storage.json cert_storage.json
$ chmod 600 cert_*
$ sudo chown root:root cert_*

Via les labels, on peut enfin paramétrer le service derrière traefik pour qu'il puisse bénéficier du résolveur ici nommé “resolver-letsencrypt”

version: "3.3"

services:
  traefik:
  ...
   
  whoami-secure:
    image: containous/whoami
    depends_on:
      - traefik

    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami_insecure.entryPoints=HTTP"
      - "traefik.http.routers.whoami_insecure.rule=Host(`whoami.fqdn`)"
      - "traefik.http.middlewares.https-redirect.redirectscheme.scheme=https"
      - "traefik.http.middlewares.https-redirect.redirectscheme.permanent=true"
      - "traefik.http.routers.whoami_insecure.middlewares=https-redirect@docker"
      - "traefik.http.routers.whoami_secure.entrypoints=HTTPS"
      - "traefik.http.routers.whoami_secure.rule=Host(`whoami.fqdn`)"
      - "traefik.http.routers.whoami_secure.tls=true"
      - "traefik.http.routers.whoami_secure.tls.certresolver=resolver-letsencrypt"
    ...

Références