传输选项以确保Net / http客户端通过TLS 1.2连接

时间:2018-09-12 15:18:44

标签: go

我有一个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)

基于对文档的快速阅读,我相信我需要使用Transport并使用该传输方式来建立我的客户端。像这样:

tr := &http.Transport{
    ... some options here ...
}
client := &http.Client{Transport: tr}

但是我不确定应该设置哪些选项。

2 个答案:

答案 0 :(得分:3)

在撰写本文时,如果服务器支持,Go将自动讲TLS 1.2。

tls.ConnectionState报告连接的各种协商的TLS参数,包括协议版本。

要获得HTTP客户端的基础TLS连接,最简单的方法是将DialTLS的{​​{1}}字段设置为建立并记住连接的函数。响应到达后(但要关闭响应正文!),请致电tls.Conn.ConnectionState

Transport

答案 1 :(得分:1)

docs

  

Package tls部分实现了RFC 5246中指定的TLS 1.2。

那只蜜蜂说我保留此功能作为创建必要配置的代码段:

func NewTLSConfig(clientCertFile, clientKeyFile, caCertFile string) (*tls.Config, error) {
 tlsConfig := tls.Config{}

 // Load client cert
 cert, err := tls.LoadX509KeyPair(clientCertFile, clientKeyFile)
 if err != nil {
  return &tlsConfig, err
 }
 tlsConfig.Certificates = []tls.Certificate{cert}

 // Load CA cert
 caCert, err := ioutil.ReadFile(caCertFile)
 if err != nil {
  return &tlsConfig, err
 }
 caCertPool := x509.NewCertPool()
 caCertPool.AppendCertsFromPEM(caCert)
 tlsConfig.RootCAs = caCertPool

 tlsConfig.BuildNameToCertificate()
 return &tlsConfig, err
}

之后,您只需要初始化传输:

transport := &http.Transport{TLSClientConfig: tlsConfig}
client := &http.Client{Transport: transport}