我正在使用toxiproxy。我有this exact issue。问题中提到的两个curl
解决方案都有效(solution a,solution b),但我不能使用curl。我需要使用go标准net/http
库。
有没有办法以这种方式使用net/http
我可以明确地告诉它代理使用的主机,这样可以看到证书有效?
我已尝试在net / http.Request上设置Host
和Authority
标头,但这不起作用。
详情
Toxiproxy输出:
proxy = [::]:22002 upstream = maps.googleapis.com:443
我的代码:
url := "https://localhost:22002/maps/api/geocode/json..."
req, err := http.NewRequest("GET", url, nil)
req.Host = "maps.googleapis.com"
req.Header.Set("Host", "maps.googleapis.com")
res, err := httpClient.Do(req)
错误:
x509:证书对* .googleapis.com有效, * .clients6.google.com,* .cloudendpointsapis.com,cloudendpointsapis.com,googleapis.com,而非localhost
答案 0 :(得分:1)
您需要设置http.Request.Host
字段,以便http请求具有正确的标头
req.Host = "maps.googleapis.com"
您还需要在tls.Config.ServerName
字段中设置主机名以进行SNI和主机名验证。
如果您已为httpClient
配置了传输,则可以这样设置:
httpClient.Transport.(*http.Transport).TLSClientConfig = &tls.Config{
ServerName: "maps.googleapis.com",
}
或者对于小程序,您可以覆盖默认值:
http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{
ServerName: "maps.googleapis.com",
}
或为您的程序创建自定义传输
var httpTransport = &http.Transport{
Proxy: http.ProxyFromEnvironment,
DialContext: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
DualStack: true,
}).DialContext,
MaxIdleConns: 100,
IdleConnTimeout: 90 * time.Second,
TLSHandshakeTimeout: 10 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
TLSClientConfig: &tls.Config{
ServerName: "maps.googleapis.com",
},
}
请确保您重复使用传输,并且不为每个请求创建新的传输。