【问题标题】:How to specify custom SSL roots with Go on Linux如何在 Linux 上使用 Go 指定自定义 SSL 根
【发布时间】:2015-12-14 09:06:22
【问题描述】:

假设我正在使用我不想修改的第三方网络库。它使用标准的http.Request 接口发出一些HTTPS 请求。

我在没有安装证书根的嵌入式 Linux 实例上运行它,我可以访问的唯一目录是 /data。这意味着你得到了错误:

Get https://example.com/: x509: failed to load system roots and no roots provided

有没有办法真正提供根?据我所知Go looks in these directories for X509 certificate roots (see also):

var certFiles = []string{
    "/etc/ssl/certs/ca-certificates.crt", // Debian/Ubuntu/Gentoo etc.
    "/etc/pki/tls/certs/ca-bundle.crt",   // Fedora/RHEL
    "/etc/ssl/ca-bundle.pem",             // OpenSUSE
    "/etc/pki/tls/cacert.pem",            // OpenELEC
}
var certDirectories = []string{
    "/system/etc/security/cacerts", // Android
}

正如我所说,我无权访问这些,以及 root pool seems to be private,所以你不能附加到它:

var (
    once        sync.Once
    systemRoots *CertPool
)
func systemRootsPool() *CertPool {
    once.Do(initSystemRoots)
    return systemRoots
}

这对 Go 来说是不可能的吗?

【问题讨论】:

  • 这是您要找的吗? stackoverflow.com/questions/21562269/…
  • 不,他们指定了一个新的根池,用于自定义 http.Client。它们不会替换系统根目录。但是我找到了另一种方法(马上回答......)
  • 你不需要替换systemRoots,它只是提供一个默认值。你不能用自定义的tls.Config 和你自己的RootCAs 做什么。
  • 密钥是http.DefaultTransport.TLSClientConfig。另一个问题没有提到它。 (这不是重复的;我不知道你为什么这样标记它。)
  • 抱歉,您似乎在使用自定义 RootCA 创建 tls.Config 时遇到了问题,而将其分配给默认值是显而易见的部分。

标签: linux go ssl-certificate x509


【解决方案1】:

这样的事情似乎可行(我实际上只需要一个证书链,您可以通过单击 SSL 锁定图标,更多信息,查看证书,详细信息,导出,将类型更改为“X509 证书与链 (PEM)"。

func initCerts() error {
    certs := x509.NewCertPool()
    pemData, err := ioutil.ReadFile("api.example.crt")
    if err != nil {
        return err
    }
    certs.AppendCertsFromPEM(pemData)

    newTlsConfig := &tls.Config{}
    newTlsConfig.RootCAs = certs

    defaultTransport := http.DefaultTransport.(*http.Transport)
    defaultTransport.TLSClientConfig = newTlsConfig
    return nil
}

我不确定,但文档建议您必须在使用任何 TLS 函数之前执行此操作,因此我将其放在 main() 的开头。

【讨论】:

  • 你不会影响任何 tls 函数,你在 http 包中分配了一些东西。在使用 http.DefaultTransport 之前,您确实需要分配它,它由任何未定义传输的 http.Client 使用。
猜你喜欢
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多