假设我使用了我不想修改的第三方网络库。它使用标准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来说是不可能的吗?
答案 0 :(得分:0)
这样的东西似乎有效(我实际上只需要一个证书链,你可以通过点击SSL锁图标,更多信息,查看证书,详细信息,导出,更改类型到“X509证书”,轻松地从Firefox获得chain(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()
的开头。