[英]docker toolbox on windows then docker run hello-world gets x509: certificate signed by unknown authority
[英]Golang HTTP x509: certificate signed by unknown authority error
我正在使用 Golang 1.9.2 创建客户端应用程序,但在访问我的后端时遇到了一些问题。 问题是我的应用程序在最新版本的 Windows 和 Linux 中运行良好,但是当我在 Windows XP 上运行它时(是的,不幸的是我必须支持 Windows XP,因为我们的一些客户拒绝升级他们的操作系统)我尝试执行 HTTP GET 和 HTTP POST 时出现此错误: x509: certificate signed by unknown authority
。
我在 Windows XP 中使用 Firefox ESR 浏览器和 Chromium 浏览器运行了相同的 GET 命令,但没有人抱怨证书问题。
请注意,我的证书有效并由受信任的机构签署。
我做了一些研究,我发现有些人有同样的问题,并通过使用以下方法忽略 TLS 验证来解决它:
import ("net/http"; "crypto/tls")
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify : true},
}
client := &http.Client{Transport: tr}
resp, err := client.Get("https://someurl:443/)
所以我将此添加到我的代码中,但它仍然无法正常工作:
// NewAPIClient - creates a new API client
func NewAPIClient() Client {
c := &APIClient{}
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkyVerify: true},
}
c.client = &http.Client{Transport: tr}
return c
}
// GetTasks - retrieves a list of tasks from the backend.
func (c *APIClient) GetTasks() ([]byte, error) {
conf := config.GetInstance()
url := fmt.Sprintf("%s/myurl", conf.GetConfig().APIUrl)
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
log.WithError(err).Errorf("Error creating HTTP request")
return nil, err
}
// Add headers
req.Header.Add("Authorization", conf.GetConfig().APIToken)
req.Header.Add("Accept", "application/json")
log.Info("Retrieving tasks from the API")
resp, err := c.client.Do(req)
if err != nil {
log.WithError(err).Errorf("Error retrieving tasks from the backend")
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
errMsg := fmt.Sprintf("Received status: %s", resp.Status)
err = errors.New(errMsg)
log.WithError(err).Error("Error retrieving tasks from the backend")
return nil, err
}
tasks, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.WithError(err).Error("Error reading tasks response body")
return nil, err
}
log.Info("The tasks were successfully retrieved")
return tasks, nil
}
有没有另一种方法可以解决这个问题,而不必忽略证书验证? 如果没有,我在代码中做错了什么?
Golang 使用操作系统证书存储。 以下注释表明 Go 在 Windows 上使用 Windows 商店, 类似于 Linux 。
// CertGetCertificateChain 将遍历 Windows 的根存储以尝试构建经过验证的证书链
此注释和相关代码位于以下文件中:
https://golang.org/src/crypto/x509/root_windows.go
将服务器证书、中间 CA 证书和/或根 CA 证书添加到 Windows XP 证书存储区。 您可以使用 IBM 发布的以下 Windows XP 说明:
程序
- 在 Windows XP 中,选择开始 > 运行以打开命令行。
- 在“运行”对话框中键入
mmc
,然后单击“确定”以运行 Microsoft 管理控制台 (MMC)。- 在 MMC 中,选择File > Add/Remove Snap-in 。
- 单击添加。
- 单击证书。
- 单击我的用户帐户。
- 单击完成。
- 单击“添加独立管理单元”对话框上的“关闭”。
- 单击“添加/删除管理单元”对话框上的“确定”。
参考: https : //www.ibm.com/docs/en/b2b-integrator/5.2?topic= xp-install-root-certificate-in- windows
GlobalSign 和 Securely 为更现代的 Windows 版本提供了类似的说明,但上面的 IBM 链接专门用于 Windows XP。 下面的 Securely 文档还包括屏幕截图。
你这样做:
// NewAPIClient - creates a new API client
func NewAPIClient() Client {
c := &APIClient{}
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkyVerify: true}, // <--- Problem
}
c.client = &http.Client{Transport: tr}
return c
}
但它是InsecureSkipVerify
而不是InsecureSkyVerify
。
但是要小心,因为InsecureSkipVerify
控制客户端是否验证服务器的证书链和主机名。 如果InsecureSkipVerify
为真,crypto/tls接受服务器提供的任何证书和该证书中的任何主机名。 在这种模式下,除非使用自定义验证,否则 TLS 容易受到中间机攻击。 这应该仅用于测试或与VerifyConnection 或VerifyPeerCertificate 结合使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.