Martian Proxy 是一个可编程的 HTTP 代理,专为测试而设计。
如果你想要:
那么 Martian 是一个很好的工具。
借助 Go 的交叉编译特性,Martian 可以部署在任何 Go 支持的目标平台上。
v3.0.0
Go 1.11
Martian Proxy 从 v3.0.0 开始支持 Go 模块。如果你使用的 Go 版本不支持模块,这将对你造成影响。最后一个不支持 Go 模块的版本被标记为 v2.1.0。
Martian Proxy 可以使用 go install 进行安装
go get github.com/google/martian/ && \
go install github.com/google/martian/cmd/proxy
假设你已经安装了 Martian,运行代理很简单:
$GOPATH/bin/proxy
如果你想在 Martian 运行时查看系统日志,请传入详细程度标志:
$GOPATH/bin/proxy -v=2
默认情况下,Martian 将在端口 8080 上运行,Martian API 将在端口 8181 上运行。端口可以通过标志指定:
$GOPATH/bin/proxy -addr=:9999 -api-addr=:9898
对于请求和响应的日志记录,可以使用日志修改器,或者如果使用 -har 标志,则可以使用 HAR 日志。
要在 Martian 中启用 HAR 日志记录,请使用 -har 标志调用二进制文件:
$GOPATH/bin/proxy -har
如果启用了 -har 标志,将有两个与 HAR 相关的端点可用:
GET http://martian.proxy/logs
将检索自上次重置以来代理所见的所有请求和响应的 HAR 日志。
DELETE http://martian.proxy/logs/reset
将重置内存中的 HAR 日志。请注意,除非定期重置,否则日志将无限增长。
一旦 Martian 运行起来,你需要配置它的行为。如果没有配置,Martian 只是代理请求和响应,而不会对它们做任何操作。如果启用了日志记录,则无需额外配置即可进行日志记录。
Martian 通过通过 HTTP 发送的 JSON 消息进行配置,这些消息的一般形式如下:
{
"header.Modifier": {
"scope": ["response"],
"name": "Test-Header",
"value": "true"
}
}
上述配置告诉 Martian 在所有响应上注入一个名为 "Test-Header"、值为 "true" 的标头。
让我们分解一下这条消息的各个部分。
[package.Type]:你想使用的修改器的包类型。在这里是 "header.Modifier",它是设置标头的修改器的名称(要了解更多关于 header.Modifier 的信息,请参阅修改器参考)。
[package.Type].scope:指示是将修改器应用于请求、响应还是两者。这可以是一个包含 "request"、"response" 或两者的数组。
[package.Type].[key]:修改器特定的数据。对于标头修改器来说,我们需要标头的 name 和 value。
这是一个简单的配置,对于更复杂的配置,修改器与组和过滤器结合使用,以组合出所需的行为。
要配置 Martian,请将 JSON POST 到 http://martian.proxy/modifiers。你可以使用所选择的任何语言提供的机制来发出 HTTP 请求,但出于演示目的,curl 可以正常工作(假设你的配置在一个名为 modifier.json 的文件中)。
curl -x localhost:8080 \
-X POST \
-H "Content-Type: application/json" \
-d @modifier.json \
"http://martian.proxy/configure"
如果配置得当,Martian 支持修改 HTTPS 请求和响应。
为了使 Martian 能够拦截 HTTPS 流量,必须在浏览器中安装一个自定义的 CA 证书,这样就不会显示连接警告。
安装 CA 证书的最简单方法是使用必要的标志启动代理,使用 -cert 和 -key 标志指定自定义 CA 证书和私钥,或者使用 -generate-ca-cert 标志让代理生成一个。
代理启动后,在配置为使用该代理的浏览器中访问 http://martian.proxy/authority.cer,将出现安装证书的提示。
在 examples/main.go 中有几个标志可用于配置 MITM 功能:
-key=""
PEM 编码的 CA 证书私钥文件,与 -cert 提供的证书一起使用;用于签名即时生成的证书
-cert=""
PEM 编码的 CA 证书文件,用于生成证书
-generate-ca-cert=false
生成一个用于中间人攻击的 CA 证书和私钥;选择此选项的大多数用户会立即在需要拦截其流量的浏览器中访问 http://martian.proxy/authority.cer 以安装新生成的 CA 证书
-organization="Martian Proxy"
在中间人攻击期间,动态生成的证书上设置的组织名称
-validity="1h"
动态生成的证书在请求时间前后有效的时间窗口;总有效时间范围是 validity 值的两倍(请求前 1 小时和请求后 1 小时)
假设你已经配置 Martian 验证特定 URL 的响应中是否存在某个特定标头。
以下是一个配置,用于验证所有对 example.com 的请求都返回 200 OK 响应。
{
"url.Filter": {
"scope": ["request", "response"],
"host" : "example.com",
"modifier" : {
"status.Verifier": {
"scope" : ["response"],
"statusCode": 200
}
}
}
}
一旦 Martian 运行、配置完成,并且你想要验证的请求和结果响应已经发生,你可以验证你期望只收到 200 OK 响应。
要检查验证,请执行
GET http://martian.proxy/verify
未满足的期望会被记录为错误,通过向 host:port/martian/verify 发送 GET 请求可以检索到错误列表,该请求将返回一个错误列表:
{
"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"
}
]
}
验证错误保存在内存中,直到通过以下方式明确清除:
POST http://martian.proxy/verify/reset
Martian 也可以被包含到任何 Go 程序中,并作为库使用。
Martian 的请求和响应修改系统被设计为通用且可扩展的。设计目标是提供独立的修改器行为,这些行为可以组合起来构建几乎任何所需的修改。
在使用 Martian 组合行为时,你需要熟悉以下不同类型的交互:
修改器、过滤器和组都实现了 RequestModifier、ResponseModifier 或 RequestResponseModifier(定义在 martian.go 中)。
ModifyRequest(req *http.Request) error
ModifyResponse(res *http.Response) error
在整个代码(和本文档)中,你会看到使用“修改器”一词来涵盖修改器、组和过滤器。即使一个组不修改请求或响应,我们仍然将其称为“修改器”。
我们将任何实现了 modifier 接口的东西称为 Modifier。
每个修改器必须在 Martian 中注册自己的解析器。解析器负责将 JSON 消息解析为实现修改器接口的 Go 结构体。
Martian 将修改器解析器存储为一个从字符串到函数的映射,该映射在运行时构建。每个修改器负责通过在 init() 中调用 parse.Register 来注册其解析器。
parse.Register 的签名:
Register(name string, parseFunc func(b []byte) (interface{}, error))
Register 接受一个字符串形式的键,格式为 package.Type。例如,cookie_modifier 以键 cookie.Modifier 注册,query_string_filter 以 querystring.Filter 注册。该字符串与 JSON 配置消息中的 name 值相同。
在以下配置消息中,header.Modifier 是标头修改器在 header_modifier.go 的 init() 中注册的方式。
{
"header.Modifier": {
"scope": ["response"],
"name" : "Test-Header",
"value" : "true"
}
}
来自 header_modifier.go 的解析器注册示例:
func init() {
parse.Register("header.Modifier", modifierFromJSON)
}
func modifierFromJSON(b []byte) (interface{}, error) {
...
}
如果你有一个我们尚未开发相应修改器、过滤器或验证器的用例,你可以很容易地根据你的非常具体需求扩展 Martian。
一个修改器有两个必需部分:
任何实现了这些接口的 Go 结构体都可以作为 modifier 使用。
有关如何使用 Martian 的问题和评论、功能公告或设计讨论,请查看我们的公共 Google Group:https://groups.google.com/forum/#!forum/martianproxy-users。
对于与安全相关的问题,请向我们的私人核心组发送详细报告:[email protected]。
这不是 Google 官方产品(无论实验性的还是其他),它只是碰巧由 Google 拥有的代码。