Générer automatiquement des certificats Let's Encrypt avec Traefik Proxy

Objectif

Dans cet article, nous allons voir comment installer, sous Docker, Traefik Proxy 2.8 et comment le paramétrer pour générer des certificats Let's Encrypt avec la note A+.

Préambule

J'ai connu Traefik grâce à la chaîne Xavki, avant de m'essayer à Traefik, j'utilisais Nginx pour faire du Reverse Proxy sur mes conteneurs Docker. Traefik simplifie grandement la mise en place d'un Reverse Proxy, si vous souhaitez en savoir plus, Xavki a mis en ligne, récemment, une playlist assez complète au sujet de Traefik. Découvrir la playlist...

Tutoriel

Arborescence

J'utilise Traefik avec Docker et plus précisément avec Docker Compose. Commençons par créer un dossier dans lequel nous allons travailler :

mkdir traefik && cd traefik

Dans ce dossier, nous allons créer les dossiers data, providers et logs pour la persistance des données de Traefik :

mkdir -p src/data src/providers src/log

Conteneur Traefik

Fichier de configuration : docker-compose.yml

À la racine de notre projet (dossier traefik), nous allons créer un fichier docker-compose.yml contenant :

version: '3'
services:
  traefik:
    image: "traefik:v2.8"
    ports:
      - 80:80
      - 443:443
      - 8080:8080
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./src/data:/etc/traefik
      - ./src/providers:/providers
      - ./src/log:/var/log/traefik

Fichier de configuration : traefik.toml

Pour paramétrer Traefik, il y a plusieurs possibilités qui sont référencées dans la documentation : Lien vers la documentation

Pour ma part, j'utilise le fichier traefik.toml. Ce fichier doit être créé dans le dossier data de notre projet.

Voici ce qu'il doit contenir :

[api]
  insecure = false
  dashboard = false

[providers]
  [providers.docker]
    exposedByDefault = false
  [providers.file]
    directory = "/providers/"
    watch = true

[entryPoints]
  [entryPoints.web]
    address = ":80"
  [entryPoints.websecure]
    address = ":443"

[log]
  filePath = "/var/log/traefik/traefik.log"
  level = "DEBUG"

[accessLog]
  filePath = "/var/log/traefik/access.log"

[certificatesResolvers]
  [certificatesResolvers.le-resolver]
    [certificatesResolvers.le-resolver.acme]
      email = "[email protected]"
      storage = "/etc/traefik/acme.json"
      [certificatesResolvers.le-resolver.acme.tlsChallenge]

Voici quelques précisions sur le fichier de configuration :

Les fichiers de logs sont situés dans le volume persistant que nous avons renseignés dans le docker-compose.yml.

N'oubliez pas de remplacer [email protected] par votre adresse email.

Fichier de configuration : tls.toml

Nous allons donc ajouter un fichier de configuration qui nous permettra d'augmenter la sécurité de notre certificat.

Au sein du dossier providers, nous allons créer le fichier tls.toml contenant :

[http]
  [http.middlewares]
    [http.middlewares.security.headers]
      frameDeny = true
      sslRedirect = true
      browserXssFilter = true
      contentTypeNosniff = true
      #HSTS
      stsIncludeSubdomains = true
      stsPreload = true
      stsSeconds = 31536000

[tls.options]
  [tls.options.mytlsoption]
    minVersion = "VersionTLS12"
    cipherSuites = [
      "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
      "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
      "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
      "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
      "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
    ]
    curvePreferences  = [
      "CurveP521",
      "CurveP384"
    ]
    sniStrict = true

Je remercie Teddy, car j'ai pu améliorer la sécurité de mon conteneur. Je vous encourage vivement à lire son article.

Build et lancement

Pour terminer cette partie, lancer la commande ci-dessous pour construire et lancer le conteneur Traefik :

docker-compose up -d

Résultat

Une fois lancé, vous pouvez exécuter la commande docker logs <nom-du-conteneur-docker>, dans mon cas la commande est docker logs traefik_traefik_1, afin de vérifier que le fichier de configuration est bien chargé.

Conteneur Nginx

Pour générer un certificat, nous allons utiliser un conteneur Nginx. Pour ce faire, nous allons ajouter au fichier docker-compose.yml le bloc ci-dessous :

nginx:
    image: "nginx:1.23"
    expose:
      - 80
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.to-nginx.entrypoints=web,websecure"
      - "traefik.http.routers.to-nginx.rule=Host(`votre-nom-de-domaine-public.com`)"
      - "traefik.http.routers.to-nginx.tls=true"
      - "traefik.http.routers.to-nginx.tls.certresolver=le-resolver"
      - "[email protected]"
      - "[email protected]"

Le bloc labels permet d'indiquer à Traefik, car il écoute le socket Docker, les paramètres à utiliser pour le conteneur, expliqué ci-dessous :

  • La 1ère ligne "active" Traefik sur ce conteneur, car nous avions indiqué, dans le fichier traefik.toml, la valeur exposedByDefault à false. Lorsque la valeur est à true, Traefik est activé sur tous les conteneurs.
  • La 2ème ligne indique les points d'entrées à utiliser par le routeur, dans notre cas ce sera web et websecure, soit les ports 80 et 443.
  • Les 2 lignes suivantes activent le TLS, en utilisant le resolver le-resolver que nous avons créé dans le fichier traefik.toml.
  • Les 2 dernières lignes activent les paramètres que nous avons définis dans le fichier tls.toml

Build et lancement

Pour terminer cette partie, lancer la commande ci-dessous pour construire et lancer le conteneur Nginx :

docker-compose up -d

Résultat

Vous pouvez visualiser la page en lançant votre navigateur à l'adresse : http://votre-nom-de-domaine-public.com. Vous devriez avoir une page HTML en HTTPS avec un certificat.

Vous pouvez tester la configuration TLS en lançant votre navigateur à l'adresse : https://www.ssllabs.com/ssltest/, puis en renseignant l'adresse de votre site internet.

Vous devriez avoir la note A+ qui s'affiche.