登录
首页 >  Golang >  Go问答

使用多个 HTTP 客户端并配置不同的 TLS 设置

来源:stackoverflow

时间:2024-02-24 23:36:26 397浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《使用多个 HTTP 客户端并配置不同的 TLS 设置》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

尝试实现多个 http 客户端来调用多个服务,每个客户端都有自己的 tls 配置(有些需要 mtls,有些则不需要)。但是,我看到每个新请求都使用之前请求中的 tls 配置,而不是它自己的 tls 配置?例如,我有 2 个客户,如下所示。当 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 意味着服务器证书未经过验证。


正确答案


http.defaulttransporthttp 包 (here) 中定义的变量,如下所示:

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 的更改将对使用 defaulttransporthttp.client 的所有实例产生影响。

要解决此问题,请定义您自己的 transport (也许通过复制上面的内容,这在 the docs 中有所介绍)或复制 (tr := http.defaulttransport.(*http.transport).clone())更改 tlsclientconfig 之前的默认传输。

理论要掌握,实操不能落!以上关于《使用多个 HTTP 客户端并配置不同的 TLS 设置》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>