Варианты транспорта для обеспечения подключения клиента net / http через TLS 1.2 - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть служба go, которая отправляет запросы REST на HTTP-сервер, который я не контролирую.Клиент попросил меня «подтвердить», что моя служба подключается через 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 голосов
/ 12 сентября 2018

На момент написания, Go будет автоматически говорить по TLS 1.2, если сервер поддерживает его.

tls.ConnectionState сообщает о различных согласованных параметрах TLS соединения, включая версию протокола.

Чтобы получить базовое TLS-соединение для HTTP-клиента, проще всего установить в поле 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
0 голосов
/ 12 сентября 2018

Из документов

Пакет tls частично реализует TLS 1.2, как указано в RFC 5246.

Тот человек сказал, что я сохраняю эту функцию как фрагмент для создания необходимой конфигурации:

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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...