【问题标题】:Golang: how to specify certificate in TLS config for http clientGolang:如何在 TLS 配置中为 http 客户端指定证书
【发布时间】:2014-02-28 23:59:40
【问题描述】:

我有一个证书文件,该位置是:/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 并在第 1 行之后添加了 /usr/abc/my.crt。 12,它奏效了。但问题是我的证书文件位置可能会改变,所以我从 root_unix.go 中删除了硬编码行,并在构建 TLSConfig 时尝试动态传递它。

【问题讨论】:

    标签: ssl go ssl-certificate


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢@JimB,但这并不能解决问题。正如您建议传递 pemData,而我有文件路径。我偶然发现了gist.github.com/spikebike/2232102,但它正在使用 LoadX509KeyPair 而我只有一个证书文件
    • @JVK 我不明白你的评论。我将添加一些更明确的代码。
    • 感谢@JimB,这是使用 pem 文件的最简单方法。我们有什么方法可以同时使用密码短语吗?
    • @Manu:我不明白。这个答案是关于添加 CA 的。不涉及私钥,因此您不需要密码。
    • 对不起,如果我在错误的上下文中写作。我正在尝试使用 pem 文件连接到苹果推送通知服务。我的代码如下所示。我必须使用密码短语和 pem 文件。 certs := x509.NewCertPool() pemData, err := ioutil.ReadFile("pemfile.pem") if err != nil { // do error } certs.AppendCertsFromPEM(pemData) mTLSConfig.ClientCAs = certs cacerts := x509.NewCertPool() pemData2, err := ioutil.ReadFile("cacertificate.pem") if err != nil { // do error } cacerts.AppendCertsFromPEM(pemData2) mTLSConfig.RootCAs = cacerts
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多