Go 加载根证书
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}
有问题吗?点此反馈!
温馨提示:反馈需要登录