Globale HTTP zu HTTPS Weiterleitung in Traefik

Image of Felix Klauke
Felix Klauke

Traefik kann für uns das komplette Handling von SSL-Zertifikaten übernehmen. In den Standard Einstellungen bleiben jedoch viele HTTP Endpunkte offen, die wir am liebsten auch bedienen würden.

 

Traefik

Schon seit einiger Zeit kommt bei Klauke Enterprises in allen Kubernetes und Docker Deployments traefik als Reverse Proxy zum Einsatz. Traefik beschreibt sich selbst als Cloud Native Edge Router und integriert sich sehr gut in alle so ziemlich alle Arten von Container Deployments. Beispielsweise werden alle Wordpress Deployments, die in docker-compose laufen, mit Traefik an das Internet angebunden. Die Konfiguration ist sehr einfach:

    wordpress:
    image: wordpress:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.wordpress.rule=Host(`my-wordpress-site.de`)"
      - "traefik.http.routers.wordpress.entrypoints=websecure
      - "traefik.http.routers.wordpress.tls.certresolver=letsencryptresolver"
      - "traefik.http.services.wordpress.loadbalancer.server.port=80"

Dabei werden die SSL-Zertifikate über den letsencryptresolver bereitgestellt. Viel wichtiger sind jedoch die ersten beiden Zeilen, in denen der Router mit Host und Entrypoint konfiguriert wird. Dabei wird der Host my-wordpress-site.de über den websecure Entrypint bereitgestellt. Das ist es was wir wolle: Unsere Webseite über HTTPS aufrufen.

Aber wenn der Job einfach würde, dann würde er keinen Spaß machen. Auch wenn manche Browser bereits versuchen, HTTPS überall zu nutzen, wo es möglich ist, so kann es sein, dass man noch HTTP Requests bekommt. Ohne weitere Maßnahmen würde die Standardkonfiguration dann einen 404-Fehler werfen, weil unser entrypoint bisher nur HTTPS und nicht HTTP bedient. 

Um das zu beheben haben wir zwei Optionen:

  1. Wir fügen unserer Wordpress Instanz einen zweiten Router hinzu, der sich um HTTP anfragen kümmert
  2. Wir leiten global alle Anfragen an HTTPS weiter

Auch wenn Option zwei sich am Anfang recht brachial anhört, so ist sie bei näherer Betrachtung einfacher und schneller. Durch Traefik und die automatische Provisionierung von SSL Zertifikaten sind wir sowieso nicht mehr auf HTTP angewiesen. Wir betrachten also hier den globalen Redirect von HTTP auf HTTPS mit traefik.

 

HTTP auf HTTPs weiterleiten

Die ganze Kunst besteht darin, dem HTTP entrypoint die richtigen Redirections hinzuzufügen:

      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.web.http.redirections.entryPoint.scheme=https"
      - "--entrypoints.web.http.redirections.entrypoint.permanent=true"

Diese hängen wir einfach an den normalen Command des Containers and und schon sind wir ready to go. Alle Requests an den web Endpoint werden von jetzt an an den websecure Endpoint weitergeleitet. Wohlgemerkt mit einem permanenten Redirect. Ähnlich wie bei HSTS solltet ihr euch also sicher sein, bevor ihr diese Option in Betracht zieht.

Wir gucken uns zum Schluss noch einmal eine komplette Traefik Konfiguration aus der docker-compose mit den beiden Endpunkten an:

  traefik:
    image: traefik:v2.2
    container_name: traefik
    command:
      - "--entrypoints.web.address=:80"
     
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.web.http.redirections.entryPoint.scheme=https"
      - "--entrypoints.web.http.redirections.entrypoint.permanent=true"

      - "--entrypoints.websecure.address=:443"

 

Du brauchst Hilfe bei der Konfiguration deines Docker-Setups? Hinterlasse gerne eine Nachricht und ich komme so schnell wie möglich auf dich zu!

Kontakt aufnehmen

Kommentieren

Blog

Verwandte Artikel