我正在使用Golang 1.9创建一个客户端应用程序。2,我在访问后端时遇到一些问题。问题是我的应用程序在最新版本的Windows和Linux中运行良好,但是,当我在Windows XP上运行它时(是的,不幸的是,我必须支持Windows XP,因为我们的一些客户拒绝升级他们的操作系统),我在尝试执行HTTP get和HTTP POST:x509:由未知授权机构签名的证书时出现此错误。
我在WindowsXP中使用FirefoxESR浏览器和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
}
有没有另一种方法可以解决这个问题,而不必忽略证书验证?如果没有,我在代码中做错了什么?
你正在这样做:
// 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
。
但是要小心,因为unsecureskipverify
控制客户端是否验证服务器的证书链和主机名。如果unsecureskipverify
为true,则crypto/tls接受服务器提供的任何证书以及该证书中的任何主机名。在此模式下,TLS容易受到中间机攻击,除非使用自定义验证。这只能用于测试或与VerifyConnection或VerifyPeerCertificate结合使用。
Golang使用OS证书存储。以下注释表明Go在Windows上使用Windows应用商店,类似于Linux。
//CertGet证书链将遍历Windows的根存储,试图构建经过验证的证书链
此注释和相关代码位于以下文件中:
https://golang.org/src/crypto/x509/root_windows.go
将服务器证书、中间CA证书和/或根CA证书添加到Windows XP证书存储库。您可以使用IBM发布的以下Windows XP说明:
程序
裁判:https://www.ibm.com/docs/en/b2b-integrator/5.2?topic=xp-在windows中安装根证书
GlobalSign和Secure为更现代的Windows版本提供了类似的说明,但上面的IBM链接是专门针对Windows XP的。下面的安全文档还包括屏幕截图。
我有一个API服务器,使用由受尊敬的CA颁发的非自签名证书。当我连接到此服务器时,我收到以下错误: x509:由未知权限签署的证书 我使用golang客户端通过库进行连接。证书配置正确,因为我没有收到关于它的错误投诉。 我没有预料到这个错误,因为我使用的是CA。我没有得到的错误时,使用网络浏览器。
我试图从Web请求数据的一些基本示例,但是所有对不同主机的请求都会导致SSL错误:。注意:我不支持代理,也没有发生任何形式的证书拦截,因为使用curl或浏览器没有问题。 我目前使用的代码示例是: 编辑:代码运行在Arch linux内核4.9.37-1-lts上。 编辑2:显然在我的系统上的版本之间有差异,通过(重新)移动证书并重新手动安装包,问题得到了解决。
问题内容: 在运行docker命令时,我不断收到这样的错误: 我正在使用没有任何http代理的Fedora 20 x86_64。 我用google搜索,但找不到任何线索,也不知道如何解决此错误,有人可以给我一些解决此问题的提示吗? 以下是一些其他信息可能会有所帮助: 问题答案: 事实证明,这与CDN提供程序有关。 在这里检查:https : //github.com/dotcloud/docker
我很困惑,不知道会有什么错? 非常感谢任何帮助。谢谢大家...
我正在使用Go包来查询pzug。应用程序的容器化如下: 但是,我得到以下错误: 我已经尝试过这里建议的x509证书,该证书由未知的权威机构签署,但运气不佳。有什么想法吗?
我在围棋中写的反向程序有点麻烦。我想连接我的Golang Web服务器和我的Apache Web服务器。我的Apache Web服务器应该也在https和反向代理上运行。因此,我编写了以下代码,但我总是得到错误:代理错误:x509:由未知授权机构签署的证书。那么apache必须使用与apache相同的证书,还是有什么问题?这里有一些代码片段,但我认为没有ssl的证书存在问题,一切正常:( 我做了很