Golang: как указать сертификат в конфигурации TLS для http-клиента

у меня есть файл сертификата, в этом месте: /usr/abc/my.crt и я хочу использовать этот сертификат для моей конфигурации tls, чтобы мой http-клиент использовал этот сертификат при общении с другими серверами. Мой текущий код выглядит следующим образом:

mTLSConfig := &tls.Config {
    CipherSuites: []uint16 {
        tls.TLS_RSA_WITH_RC4_128_SHA,
        tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA,
        tls.TLS_RSA_WITH_AES_128_CBC_SHA,
        tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA,
        tls.TLS_RSA_WITH_AES_128_CBC_SHA,
        tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
    }
}

mTLSConfig.PreferServerCipherSuites = true
mTLSConfig.MinVersion = tls.VersionTLS10
mTLSConfig.MaxVersion = tls.VersionTLS10

tr := &http.Transport{
    TLSClientConfig: mTLSConfig,
}

c := &http.Client{Transport: tr}

Итак, как назначить сертификат в моей конфигурации TLS? Я вижу настройки сертификата вhttp://golang.org/pkg/crypto/tls/#Config может кто-нибудь предложить, как настроить мое местоположение сертификата там?

mTLSConfig.Config{Certificates: []tls.Certificate{'/usr/abc/my.crt'}}

ранее я редактировал исходный код go http://golang.org/src/pkg/crypto/x509/root_unix.go и добавил /usr/abc/my.crt после строки нет. 12 и это сработало. Но проблема в том, что мое местоположение файла сертификата может измениться, поэтому я удалил жестко закодированную строку из root_unix.идите и попробуйте передать его динамически, при построении TLSConfig.

1 ответов


вы можете заменить набор системных ЦС, предоставив корневой пул ЦС в tls.Конфиг.

certs := x509.NewCertPool()

pemData, err := ioutil.ReadFile(pemPath)
if err != nil {
    // do error
}
certs.AppendCertsFromPEM(pemData)
mTLSConfig.RootCAs = certs

Если вы все еще хотите корни системы, однако, я думаю, вам нужно будет воссоздать функциональность в initSystemRoots(). Я не вижу никакого открытого метода для объединения сертификата в системные корни по умолчанию.