问题 Golang:如何在http客户端的TLS配置中指定证书


我有一个证书文件,该位置是: /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'}} < - 错了,因为我正在传递string.right?我没有任何其他文件,如.pem或.key等,只有这个my.cert。我是空白怎么办?

早些时候,我编辑了go源代码 http://golang.org/src/pkg/crypto/x509/root_unix.go  并补充说 /usr/abc/my.crt 之后没有。 12它起作用了。但问题是我的证书文件位置可以更改,因此我在构建TLSConfig时从root_unix.go中删除了硬编码的行并尝试动态传递它。


8896
2018-02-04 20:05


起源



答案:


您可以通过在tls.Config中提供根CA池来替换系统CA集。

certs := x509.NewCertPool()

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

如果您仍然需要系统的根,我认为您需要重新创建功能 initSystemRoots()。我没有看到任何公开的方法将证书合并到默认的系统根目录。


14
2018-02-04 21:58



感谢@JimB,但这并没有解决问题。因为你是sugegsting传递pemData,而我有文件路径。我偶然发现了 gist.github.com/spikebike/2232102 但它有使用LoadX509KeyPair,而我只有一个证书文件 - JVK
@JVK我不明白你的评论。我将添加一些代码以更明确。 - JimB
谢谢@JimB,有效:) - JVK
谢谢@JimB,这是使用pem文件的最简单方法。我们有什么方法可以使用密码短语吗? - Manu
@Manu:我不明白。这个答案是关于添加CA.没有涉及私钥,因此您不需要密码。 - JimB


答案:


您可以通过在tls.Config中提供根CA池来替换系统CA集。

certs := x509.NewCertPool()

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

如果您仍然需要系统的根,我认为您需要重新创建功能 initSystemRoots()。我没有看到任何公开的方法将证书合并到默认的系统根目录。


14
2018-02-04 21:58



感谢@JimB,但这并没有解决问题。因为你是sugegsting传递pemData,而我有文件路径。我偶然发现了 gist.github.com/spikebike/2232102 但它有使用LoadX509KeyPair,而我只有一个证书文件 - JVK
@JVK我不明白你的评论。我将添加一些代码以更明确。 - JimB
谢谢@JimB,有效:) - JVK
谢谢@JimB,这是使用pem文件的最简单方法。我们有什么方法可以使用密码短语吗? - Manu
@Manu:我不明白。这个答案是关于添加CA.没有涉及私钥,因此您不需要密码。 - JimB