代理https

时间:2017-11-01 00:21:27

标签: go proxy ssl-certificate

我正在使用toxiproxy。我有this exact issue。问题中提到的两个curl解决方案都有效(solution asolution b),但我不能使用curl。我需要使用go标准net/http库。

有没有办法以这种方式使用net/http我可以明确地告诉它代理使用的主机,这样可以看到证书有效?

我已尝试在net / http.Request上设置HostAuthority标头,但这不起作用。

详情

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

1 个答案:

答案 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",
    },
}

请确保您重复使用传输,并且不为每个请求创建新的传输。