
Martian ist eine Bibliothek zum Erstellen benutzerdefinierter HTTP/S-Proxys
Martian Proxy ist ein programmierbarer HTTP-Proxy, der für Tests entwickelt wurde.
Martian ist ein großartiges Werkzeug, wenn Sie:
Dank der Cross-Kompilierung von Go kann Martian überall dort eingesetzt werden, wo Go läuft.
v3.0.0
Go 1.11
Martian Proxy unterstützt Go Modules seit Version v3.0.0. Wenn Sie eine Go-Version verwenden, die keine Module unterstützt, bricht dies. Die letzte Version ohne Go-Module-Unterstützung war v2.1.0.
Martian Proxy kann mit go install installiert werden
go get github.com/google/martian/ && \
go install github.com/google/martian/cmd/proxy
Angenommen, Sie haben Martian installiert, ist das Ausführen des Proxys so einfach wie:
$GOPATH/bin/proxy
Wenn Sie Systemlogs sehen möchten, während Martian läuft, übergeben Sie das Verbose-Flag:
$GOPATH/bin/proxy -v=2
Standardmäßig läuft Martian auf Port 8080 und die Martian-API auf Port 8181. Der Port kann über Flags angegeben werden:
$GOPATH/bin/proxy -addr=:9999 -api-addr=:9898
Für die Protokollierung von Anfragen und Antworten steht ein Logging-Modifier zur Verfügung, oder HAR-Logs, wenn das Flag -har verwendet wird.
Um HAR-Logs in Martian zu aktivieren, rufen Sie die Binärdatei mit dem Flag -har auf:
$GOPATH/bin/proxy -har
Wenn das Flag -har aktiviert wurde, stehen zwei HAR-bezogene Endpunkte zur Verfügung:
GET http://martian.proxy/logs
Ruft das HAR-Protokoll aller vom Proxy seit dem letzten Zurücksetzen gesehenen Anfragen und Antworten ab.
DELETE http://martian.proxy/logs/reset
Setzt das In-Memory-HAR-Protokoll zurück. Beachten Sie, dass das Protokoll unbegrenzt wächst, wenn es nicht regelmäßig zurückgesetzt wird.
Sobald Martian läuft, müssen Sie sein Verhalten konfigurieren. Ohne Konfiguration tunnelt Martian nur, ohne Änderungen an Anfragen oder Antworten vorzunehmen. Wenn aktiviert, erfolgt die Protokollierung ohne zusätzliche Konfiguration.
Martian wird durch JSON-Nachrichten konfiguriert, die über HTTP gesendet werden und die allgemeine Form haben:
{
"header.Modifier": {
"scope": ["response"],
"name": "Test-Header",
"value": "true"
}
}
Die obige Konfiguration weist Martian an, bei allen Antworten einen Header mit dem Namen "Test-Header" und dem Wert "true" einzufügen.
Lassen Sie uns die Teile dieser Nachricht aufschlüsseln.
[package.Type]: Der package.Type des Modifiers, den Sie verwenden möchten. In diesem Fall ist es "header.Modifier", der Name des Modifiers, der Header setzt (um mehr über den header.Modifier zu erfahren, lesen Sie bitte die Modifier-Referenz).
[package.Type].scope: Gibt an, ob der Modifier auf Anfragen, Antworten oder beide angewendet werden soll. Dies kann ein Array mit "request", "response" oder beiden sein.
[package.Type].[key]: Modifier-spezifische Daten. Im Fall des Header-Modifiers benötigen wir den name und value des Headers.
Dies ist eine einfache Konfiguration. Für komplexere Konfigurationen werden Modifier mit Gruppen und Filtern kombiniert, um das gewünschte Verhalten zusammenzustellen.
Um Martian zu konfigurieren, senden Sie die JSON per POST an http://martian.proxy/modifiers. Sie sollten den Mechanismus verwenden, den Ihre bevorzugte Sprache bietet, um HTTP-Anfragen zu stellen. Für Demonstrationszwecke funktioniert curl (vorausgesetzt, Ihre Konfiguration befindet sich in einer Datei namens modifier.json).
curl -x localhost:8080 \
-X POST \
-H "Content-Type: application/json" \
-d @modifier.json \
"http://martian.proxy/configure"
Martian unterstützt die Änderung von HTTPS-Anfragen und -Antworten, wenn dies konfiguriert ist.
Damit Martian HTTPS-Verkehr abfangen kann, muss ein benutzerdefiniertes CA-Zertifikat im Browser installiert werden, damit keine Verbindungswarnungen angezeigt werden.
Der einfachste Weg, das CA-Zertifikat zu installieren, besteht darin, den Proxy mit den erforderlichen Flags zu starten, um ein benutzerdefiniertes CA-Zertifikat und einen privaten Schlüssel mit den Flags -cert und -key zu verwenden, oder den Proxy mit dem Flag -generate-ca-cert eines generieren zu lassen.
Nachdem der Proxy gestartet wurde, rufen Sie http://martian.proxy/authority.cer im Browser auf, der für die Verwendung des Proxys konfiguriert ist, und es wird eine Eingabeaufforderung zur Installation des Zertifikats angezeigt.
In examples/main.go stehen mehrere Flags zur Verfügung, um die MITM-Funktionalität zu konfigurieren:
-key=""
PEM-codierte Datei des privaten Schlüssels des in -cert bereitgestellten CA-Zertifikats; wird verwendet, um Zertifikate zu signieren, die dynamisch generiert werden
-cert=""
PEM-codierte CA-Zertifikatsdatei, die zum Generieren von Zertifikaten verwendet wird
-generate-ca-cert=false
generiert ein CA-Zertifikat und einen privaten Schlüssel für Man-in-the-Middle; die meisten Benutzer, die diese Option wählen, besuchen sofort http://martian.proxy/authority.cer im Browser, dessen Verkehr abgefangen werden soll, um das neu generierte CA-Zertifikat zu installieren
-organization="Martian Proxy"
Organisationsname, der bei den dynamisch generierten Zertifikaten während des Man-in-the-Middle gesetzt wird
-validity="1h"
Zeitfenster um den Zeitpunkt der Anforderung herum, für das das dynamisch generierte Zertifikat gültig ist; die Dauer ist so festgelegt, dass der gesamte gültige Zeitraum das Doppelte des Gültigkeitswerts beträgt (1h vorher & 1h nachher)
Nehmen wir an, Sie haben Martian so konfiguriert, dass das Vorhandensein eines bestimmten Headers in Antworten auf eine bestimmte URL überprüft wird.
Hier ist eine Konfiguration, die überprüft, dass alle Anfragen an example.com Antworten mit 200 OK zurückgeben.
{
"url.Filter": {
"scope": ["request", "response"],
"host" : "example.com",
"modifier" : {
"status.Verifier": {
"scope" : ["response"],
"statusCode": 200
}
}
}
}
Sobald Martian läuft, konfiguriert ist und die zu überprüfenden Anfragen und resultierenden Antworten stattgefunden haben, können Sie Ihre Erwartung überprüfen, dass Sie nur 200 OK-Antworten erhalten haben.
Um Überprüfungen durchzuführen, führen Sie
GET http://martian.proxy/verify
Fehlgeschlagene Erwartungen werden als Fehler erfasst, und die Liste der Fehler wird durch eine GET-Anfrage an host:port/martian/verify abgerufen, die eine Liste von Fehlern zurückgibt:
{
"errors" : [
{
"message": "response(http://example.com) status code verify failure: got 500, want 200"
},
{
"message": "response(http://example.com/foo) status code verify failure: got 500, want 200"
}
]
}