我有一个证书文件,位置是:/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'}}<——是错误的,因为我在传递字符串.正当我没有任何其他文件,比如.pem或. keys 等等,只有这是我的.当然,我一片空白怎么办?

早些时候,我编辑了Go源代码http://golang.org/src/pkg/crypto/x509/root_unix.go,并在第12行后面添加了/usr/abc/my.crt,它起作用了.但问题是我的证书文件位置可能会更改,因此在构建TLSConfig时,我从root_unix.go中删除了硬编码行,并try 动态传递它.

推荐答案

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

certs := x509.NewCertPool()

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

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

Go相关问答推荐

SEARCH On Conflict Clause不考虑乐观锁定版本

有没有办法通过Go cmdline或IDE(IntelliJ)找出我的 struct 实现了什么接口?

golang有int32溢出吗?

我怎样才能改进这个嵌套逻辑以使其正常工作并提高性能

golang testscript .txtar 语法,用于 stderr 或 stdout 中包含的文本

死锁 - 所有 goroutine 都处于睡眠状态(即使使用等待组)

AWS Lambda 中的 Websocket URL 超时达到错误

将文本文件放入切片然后进行比较

MQTT 客户端没有收到另一个客户端发送的消息

如何确定作为函数参数传递的指针是否正在被修改或副本是否正在被修改?

Go:从 ssl 证书中获取 'subject/unstructeredName' 的值

如何将 npm 安装进度条通过管道传输到终端?

在 Golang 中,如何将接口作为泛型类型与 nil 进行比较?

Go 泛型:自引用接口约束

如何在gin中获取参数值数组

将 Simple Go Web 应用程序部署到 Elastic Beanstalk

为什么 go-cmp Equal() 说 struct 不是完全相等的,即使所有字段都非常相等?

Golang 'defer' 导致发送(接收)API 响应延迟

Go Flag 用法 描述 包含 Word 值

手动下载并放置一个 golang mod 文件