【发布时间】: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 来说是不可能的吗?
【问题讨论】:
-
不,他们指定了一个新的根池,用于自定义
http.Client。它们不会替换系统根目录。但是我找到了另一种方法(马上回答......) -
你不需要替换
systemRoots,它只是提供一个默认值。你不能用自定义的tls.Config和你自己的RootCAs做什么。 -
密钥是
http.DefaultTransport.TLSClientConfig。另一个问题没有提到它。 (这不是重复的;我不知道你为什么这样标记它。) -
抱歉,您似乎在使用自定义 RootCA 创建 tls.Config 时遇到了问题,而将其分配给默认值是显而易见的部分。
标签: linux go ssl-certificate x509