Go 加载根证书

Last Modified: 2023/08/13

Go 查找根证书

在 Linux 平台下,Go 会从以下位置查找根证书(root certificate): https://golang.org/src/crypto/x509/root_linux.go

package x509

// Possible certificate files; stop after finding one.
var certFiles = []string{
    "/etc/ssl/certs/ca-certificates.crt",                // Debian/Ubuntu/Gentoo etc.
    "/etc/pki/tls/certs/ca-bundle.crt",                  // Fedora/RHEL 6
    "/etc/ssl/ca-bundle.pem",                            // OpenSUSE
    "/etc/pki/tls/cacert.pem",                           // OpenELEC
    "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", // CentOS/RHEL 7
    "/etc/ssl/cert.pem",                                 // Alpine Linux
}

不同平台,根证书位置是不一样的,作为开发者,我们不必费心 Go 从哪查找根证书,我们只需要知道在 x509 包中提供了一个 SystemCertPool() 的方法,用这个方法即可加载系统中的根证书。

// Get the SystemCertPool, continue with an empty pool on error
rootCAs, _ := x509.SystemCertPool()

如何信任额外的根证书

如果我们使用自签名的 CA 根证书签署了一个网站证书文件,我们需要信任该根证书,才能和网站正常通信。tls.Config 中有一个 RootCAs 字段,我们只需要将自签名根证书和系统默认根证书一起传给 RootCAs 字段即可。

rootCAs, _ := x509.SystemCertPool()
if rootCAs == nil {
rootCAs = x509.NewCertPool()
}
// localCertFile 是自签名根证书的路径
certs, err := ioutil.ReadFile(localCertFile)
if err != nil {
    log.Fatalf("Failed to append %q to RootCAs: %v", localCertFile, err)
}

// Append our cert to the system pool
if ok := rootCAs.AppendCertsFromPEM(certs); !ok {
    log.Println("No certs appended, using system certs only")
}

// Trust the augmented cert pool in our client
config := &tls.Config{
    InsecureSkipVerify: *insecure,
    RootCAs:            rootCAs,
}
tr := &http.Transport{TLSClientConfig: config}
有问题吗?点此反馈!

温馨提示:反馈需要登录