当前位置: 首页 > 面试题库 >

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

呼延卓
2023-03-14
问题内容

我有一个证书文件,该位置是:/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。对吗?我没有任何其他文件,例如.pem或.key等,仅此my.cert。我是空白怎么办?

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


问题答案:

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

certs := x509.NewCertPool()

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

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



 类似资料:
  • 我在一个软件应用程序上工作,该应用程序使用gRPC在客户端和服务器之间建立双向流。 我正在寻找类似于这张票的答案的东西,只在java中:如何为gRPC启用服务器端SSL? 我想配置我的应用程序,以便他们可以选择他们想要使用的TLS场景: 场景1:明文(无加密) 场景2:服务器端TLS 场景3:共同TLS 对于TLS设置,我在非Android环境中使用Java,因此我只考虑使用https://git

  • 问题内容: 下面的答案来自这个问题。 授予的答案实际上并没有解决所有问题。它仅在数据传输的上下文中提及SSL,实际上并未涵盖身份验证。 您真的在问有关安全认证REST API客户端的问题。除非您使用TLS客户端身份验证,否则单独使用SSL并不是REST API可行的身份验证机制。没有客户端身份验证的SSL仅对服务器进行身份验证,这与大多数REST API无关。 如果您不使用TLS客户端身份验证,则

  • 我已经在Go中编写了一个简单的客户机/服务器,它将通过TLS执行HTTP GET,但我也试图使它能够通过TLS执行HTTP POST。 我现在也没有什么东西可以在服务器端处理这个帖子,但我只想让它把它打印到屏幕上,这样当我运行客户端时,我就会看到服务器打印。 我应该如何修复我的客户端代码来做一个适当的帖子?而相应的服务器代码应该是什么样子才能接受POST呢?任何帮助都将非常感谢,我有困难找到HTT

  • 我试图使用Kubernetes Python客户机连接到我的Kubernetes集群。API在由我的CA签名的SSL证书后面。如果我试图访问任何API,我会得到一个关于证书验证失败的SSL错误。 这在我测试的客户端上不起作用,但是kubectl在我的PC上起作用,所以我检查了一下,发现。kube/config文件没有指定CA证书。我把它加进去,然后就起作用了。 如果您不想在主机上创建。kube/c

  • 在构建Retor Netty应用程序时,我得到了两个相似的指标。但是它们之间到底有什么区别呢? vs. 我不知道他们在测量响应时间的方式/位置上有什么不同。哪种方法测量的时间更长并不一致。 Http客户端指标测量时间更长 ReactorNetty指标延长了时间

  • 我不知道我到底需要在哪里包含客户机证书。现在,我的第一个问题是我不信任服务器。我尝试使用默认的Java密钥库文件(cacerts),其中包含Thawte和Digicert,这些是我试图与之通信的服务器的根权限。我使用