我有一个 go 服务,它向我无法控制的 HTTP 服务器发出 REST 请求。一位客户要求我“确认”我的服务是通过 TLS 1.2 连接的。这是我可以在代码中做的事情吗?
当前代码如下所示:
request, _ := http.NewRequest("PUT",
"https://example.com/path/to/endpoint",
bytes.NewReader(json))
client := &http.Client{}
response, _ := client.Do(request)
defer response.Body.Close()
str, err := ioutil.ReadAll(response.Body)
Run Code Online (Sandbox Code Playgroud)
基于对文档的快速阅读,我相信我需要使用 aTransport并使用该传输构建我的客户端。像这样的东西:
tr := &http.Transport{
... some options here ...
}
client := &http.Client{Transport: tr}
Run Code Online (Sandbox Code Playgroud)
但我不确定我应该设置哪些选项。
在撰写本文时,如果服务器支持,Go 将自动使用 TLS 1.2。
tls.ConnectionState报告连接的各种协商 TLS 参数,包括协议版本。
要获取 HTTP 客户端的底层 TLS 连接,最简单的方法是将 的DialTLS字段设置为Transport建立并记住连接的函数。一旦响应到达(但在关闭响应主体之前!),调用tls.Conn.ConnectionState:
package main
import (
"crypto/tls"
"fmt"
"log"
"net"
"net/http"
)
func main() {
var (
conn *tls.Conn
err error
)
tlsConfig := http.DefaultTransport.(*http.Transport).TLSClientConfig
c := &http.Client{
Transport: &http.Transport{
DialTLS: func(network, addr string) (net.Conn, error) {
conn, err = tls.Dial(network, addr, tlsConfig)
return conn, err
},
},
}
res, err := c.Get("https://example.com")
if err != nil {
log.Fatal(err)
}
versions := map[uint16]string{
tls.VersionSSL30: "SSL",
tls.VersionTLS10: "TLS 1.0",
tls.VersionTLS11: "TLS 1.1",
tls.VersionTLS12: "TLS 1.2",
}
fmt.Println(res.Request.URL)
fmt.Println(res.Status)
v := conn.ConnectionState().Version
fmt.Println(versions[v])
res.Body.Close()
}
// Output:
// https://example.com
// 200 OK
// TLS 1.2
Run Code Online (Sandbox Code Playgroud)