Microservices, Docker und HTTPS
Wie bringt man Microservices, Docker und HTTPS in Einklang? Ich zeige wie man auf einem unter Linux gehostete Docker Microservice Architektur mit Traefik als Reverse-Proxy durch ein SSL Zertifikat schützt.
Microservices, Docker und HTTPS
Ich arbeite aktuell an einer Webapplikation die aus mehreren Microservices besteht. Diese werden mit Docker in Container verpackt und mit Docker-Compose als System verteilt. Ein ASP.Net Core Webservice kann man recht einfach auch über HTTPS testen, dazu stellt Visual Studio eine eigene Development-Konfiguration für Docker-Compose zur Verfügung:
Zusätzlich zur docker-compose.yml Datei findet man auch eine .override Datei in der man für jedes einzelne Service eine Development Ergänzung hinzufügen kann. Die einzelnen Werte überschreiben dabei die Werte des originalen docker-compose.yml, sind aber nur im Entwicklungsstadium verfügbar. Ich habe beispielweise die IP von Dev und Produktivsystem so als Umgebungsvariable definiert. Unter dem Punkt volumes hat Visual Studio automatisch ein Zertifikat hinzugefügt. Damit kann man unter localhost und dem installierten Docker for Windows die Services testen.
Produktivsystem
Irgendwann kommt in jedem Projekt der Punkt an dem man seine Microservices online testen möchte. Das Entwickler-Zertifikat ist am Test- oder Produktivserver oder in der Cloud nicht mehr ausreichend. Beim Start des Services wird folgender Fehler geloggt:
System.InvalidOperationException: Unable to configure HTTPS endpoint. No server certificate was specified, and the default developer certificate could not be found or is out of date.
Es wird Zeit am Zielsystem ein Zertifikat einzurichten. Wie geht das? Bei Docker heißt das Zauberwort Reverse-Proxy. Das bedeutet ein Webserver kümmert sich nicht nur darum, dass mehrere Domains und Subdomains auf einem Server auf die richtigen Seiten weitergeleitet werden, sondern auch intern die Kommunikation der einzelnen Services zu routen. Der Proxy regelt den Verkehr. Ein toller Service für diese Aufgabe ist der Open Source Proxy Traefik. Der unterstützt beispielsweise von Haus aus Let’s Encrypt und Docker. Wir legen nur noch eine kleine Konfiguration fest und alles läuft.
Ich habe meine Konfiguration von diesem Blogartikel, der hat mir schlussendlich geholfen meine Services live zu bringen. Danke dem Autor.
Traefik Konfiguration
Im ersten Schritt habe ich ein neues Docker Netzwerk mit dem Namen web angelegt:
docker network create web
Traefik als Reverse-Proxy kann man als Docker Container verwenden. Ich verwende in meiner Konfiguration die aktuellste Version (traefik:latest). Im selben Verzeichnis wie die docker-compose.yml Datei erstellt man eine traefik.toml Konfigurationsdatei. Diese fungiert als statische Standardkonfiguration von Traefik, alles weitere wird wie schon bei der PostgreSQL Datenbank im docker-compose Skript konfiguriert. Das Compose Skript wird so zwar viel umfangreicher, doch hat man die Konfiguration an einem Ort. Traefik kann von sich aus Let’s Encrypt Zertifikate beantragen. Ich habe lediglich die Domain angepasst, beim nächsten „docker-compose up“ war das Traefik Dashboard schon durch HTTPS abgesichert. Der erste Lauf legt den letsencrypt Ordner mit der acme.json Datei an.
Nachdem der erste Schritt getan war, habe ich noch meine restlichen Services hinzugefügt und die Traefik Konfiguration um einige Zeilen erweitert. Wenn man mal eine funktionierende Basisversion am Laufen hat ist es um vieles Einfacher diese anhand der recht guten Dokumentation zu erweitern.
Alternativer Weg
Alternativ kann man das Zertifikat am Server installieren und einen Webserver wie nginx konfigurieren:
Zertifikat erstellen
Du kannst auf dem Server ein eigenes Let’s Encrypt Zertifikat installieren. Ich habe das auf meinem Linux Server nach der Anleitung wie folgt gemacht (die komplette Anleitung findest du unter diesem Link). Folgende Befehle sind am Server auszuführen:
su apt install libsquashfuse0 squashfuse fuse apt install snapd snap install core snap refresh core
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot
Das Zertifikat wird mit folgendem Befehl erstellt:
certbot certonly --standalone
Es wurde ein Zertifikat erstellt und heruntergeladen. Zu finden ist dieses im /etc/letsencrypt/live/ Ordner. Das Zertifikat ist in mehrere Dateien mit der Dateiendung *.pem abgelegt.
Webserver
Als Webserver stehen einige Programme zur Auswahl. Sehr beliebt ist dabei nginx, da dieser leichtgewichtig ist und schnell. Eine Anleitung wie man diesen als Reverse Proxy mit dem Let’s Encrypt Zertifikat und als Docker Container mit einem ASP.NET Webservice konfiguriert findest du unter diesem Link.
Fazit
Will man eine Docker Microservices Architektur durch HTTPS erweitern ist ein Reverse-Proxy eine gute Möglichkeit. Traefik ist für diese Aufgabe perfekt geeignet, da es von sich aus bereits mit Docker und Let’s Encrypt zusammenarbeiten kann und noch dazu ein nettes Dashboard zur Kontrolle der Microservices Kommunikation bietet. Für mich war Traefik der Durchbruch für mein Projekt, nach vielen Stunden Recherche und probieren.
Der Artikel ist wirklich toll geschrieben. Spart mir sehr viel Eigenrecherche 😉