尝试实现多个http客户端来调用多个服务,每个服务都有自己的tls配置(有些需要mTLS,有些不需要)。但是,我看到每个新请求都使用来自先前请求的tls配置,而不是它自己的tls配置?例如,我有两个客户,如下所示。当client-1发出第一个请求时,它将按照预期验证服务器证书。但是,当client-2发出下一个请求时,即使为其配置了InsecureSkipVerify: true,它仍然试图验证服务器证书。
client-1具有配置:
tr := http.DefaultTransport.(*http.Transport)
tr.TLSClientConfig = &tls.Config{RootCAs: certPool, InsecureSkipVerify: false}
client1 := http.Client{Transport: tr, Timeout: timeout}client-2具有配置:
tr := http.DefaultTransport.(*http.Transport)
tr.TLSClientConfig = &tls.Config{RootCAs: certPool, InsecureSkipVerify: true}
client2 := http.Client{Transport: tr, Timeout: timeout}client2请求的响应是x509:由未知权威机构签名的证书。这在理想情况下不应该发生,因为InsecureSkipVerify: true意味着没有验证服务器证书。
发布于 2022-08-17 02:36:40
http.DefaultTransport是在http包(这里)中定义为下列变量的变量:
var DefaultTransport RoundTripper = &Transport{
Proxy: ProxyFromEnvironment,
DialContext: defaultTransportDialContext(&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
}),
ForceAttemptHTTP2: true,
MaxIdleConns: 100,
IdleConnTimeout: 90 * time.Second,
TLSHandshakeTimeout: 10 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
}您可以使用DefaultTransport创建多个http.Client实例,但需要记住它们都将使用相同的Transport (DefaultTransport)。对DefaultTransport的更改将对使用DefaultTransport的所有http.Client实例产生影响。
要解决这个问题,可以定义您自己的Transport (可能通过复制上面的内容,这将在医生们中讨论),或者在更改TLSClientConfig之前复制默认传输(tr := http.DefaultTransport.(*http.Transport).Clone())。
https://stackoverflow.com/questions/73381749
复制相似问题