Wie kann ich Charles Proxy in Kombination mit Docker für API-Debugging einsetzen?
- Einleitung
- Grundprinzip
- Voraussetzungen und Vorbereitung
- Docker-Container für Proxy konfigurieren
- Charles als Proxy für HTTPS aktivieren
- SSL-Proxying in Charles konfigurieren
- Praktische Umsetzung mit Docker Compose
- Netzwerk-Herausforderungen und Debugging
- Zusammenfassung
Einleitung
Charles Proxy ist ein weitverbreitetes HTTP- und HTTPS-Proxy-Tool, mit dem sich Netzwerkverbindungen transparent mitschneiden und analysieren lassen. In Verbindung mit Docker kann Charles Proxy genutzt werden, um den API-Verkehr von in Containern laufenden Anwendungen zu debuggen. Dabei dient Charles als Proxy-Server, an den Docker-Container ihre API-Anfragen weiterleiten, sodass sie sichtbar und manipulierbar werden.
Grundprinzip
Das zentrale Prinzip besteht darin, Charles Proxy auf dem Host-System zu betreiben und den Docker-Containern zu konfigurieren, ihre HTTP(S)-Requests an diesen Proxy zu senden. Charles empfängt somit alle Anfragen der Container, zeigt sie übersichtlich an und ermöglicht zusätzliche Operationen wie das Modifizieren von Requests oder Antworten.
Voraussetzungen und Vorbereitung
Zunächst muss Charles Proxy auf Ihrem lokalen Rechner installiert und gestartet sein. Ebenso sollte Docker einsatzbereit eingerichtet sein. Wichtig ist, dass der Docker-Container Zugriff auf den Host-Rechner hat – typischerweise über die Netzwerkadresse host.docker.internal (unter Windows und macOS) oder über die IP-Adresse des Hosts bei Linux.
Docker-Container für Proxy konfigurieren
Um den Traffic in Docker durch Charles zu leiten, müssen die Umgebungsvariablen oder Proxy-Einstellungen der Container angepasst werden. Beispielsweise können Sie eine Umgebungsvariable HTTP_PROXY und HTTPS_PROXY setzen, die auf den Host mit dem Charles-Proxy-Port zeigen. Standardmäßig hört Charles auf Port 8888.
Unter Windows und macOS können Sie in docker run oder im docker-compose.yml die Proxy-Konfiguration etwa so angeben:
HTTP_PROXY=http://host.docker.internal:8888HTTPS_PROXY=http://host.docker.internal:8888Unter Linux fehlt host.docker.internal häufig, dort kann die Host-IP per ip addr oder entsprechend ausgegeben werden. Anschließend wird der Proxy mit dieser IP eingetragen, z.B. http://192.168.1.100:8888.
Charles als Proxy für HTTPS aktivieren
Ein wichtiger Punkt ist das Abfangen von HTTPS-Verkehr. Charles kann als Man-in-the-Middle Proxy HTTPS-Requests entschlüsseln, wenn dem Client Zertifikate vertraut werden. Im Fall von Docker-Containern bedeutet das, das Charles Root-Zertifikat in den Containern vertrauenswürdig zu machen.
Das Zertifikat kann in Charles über Help > SSL Proxying > Install Charles Root Certificate exportiert werden. Danach muss dieses Zertifikat ins Image integriert oder zur Laufzeit in den Container kopiert und als vertrauenswürdig deklariert werden. Bei Linux-basierten Containern erfolgt dies meistens durch das Kopieren des Zertifikats nach /usr/local/share/ca-certificates/ und anschließendes Ausführen von update-ca-certificates.
SSL-Proxying in Charles konfigurieren
In Charles selbst muss SSL Proxying aktiviert werden, da ansonsten HTTPS-Verkehr nicht mitgeschnitten wird. Dies funktioniert über Proxy > SSL Proxying Settings, wo Sie entweder für alle Hosts oder gezielt für bestimmte API-Ziele das Proxying einschalten können.
Praktische Umsetzung mit Docker Compose
Hier ein einfaches Beispiel, wie ein Docker-Compose-Setup aussehen kann:
version: 3.8services: app: image: meine-api-anwendung environment: - HTTP_PROXY=http://host.docker.internal:8888 - HTTPS_PROXY=http://host.docker.internal:8888 volumes: - ./charles-cert.crt:/usr/local/share/ca-certificates/charles-cert.crt command: > sh -c "update-ca-certificates && npm start"Dabei wird das Charles-Zertifikat in den Container eingebunden und das Systemzertifikat-Store aktualisiert. Danach werden API-Anfragen des Containers an Charles weitergeleitet, der sie mitschneiden kann.
Netzwerk-Herausforderungen und Debugging
Manchmal kann es zu Netzwerkproblemen kommen, wenn Docker keine Verbindung zum Host auf dem erwarteten Port herstellen kann. Prüfen Sie diese Fälle mit Netzwerkbefehlen wie curl oder telnet im Container. Alternativ kann man das Netzwerk im Docker auf host setzen (nur unter Linux), sodass der Container direkt das Host-Netzwerk nutzt und der Proxy über localhost erreichbar ist.
Zusammenfassung
Charles Proxy dient als zentraler HTTP(S)-Proxy, an den Docker-Container ihre API-Requests weiterleiten können. Durch Einrichten der Proxy-Umgebungsvariablen in den Containern und Einbindung des Charles-Root-Zertifikats in den Container können auch verschlüsselte Verbindungen erkannt und analysiert werden. Charles bietet so eine komfortable Möglichkeit, API-Aufrufe aus Container-Umgebungen direkt mitzuschneiden, zu inspizieren und zu debuggen.
