如何使用Go on Linux指定自定义SSL根目录

时间:2015-09-17 13:17:40

标签: linux go ssl-certificate x509

假设我使用了我不想修改的第三方网络库。它使用标准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 rootssee 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来说是不可能的吗?

1 个答案:

答案 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()的开头。