当前位置: 首页 > 知识库问答 >
问题:

Golang HTTP x509:由未知授权机构签名的证书错误

宋高扬
2023-03-14

我正在使用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
}

有没有另一种方法可以解决这个问题,而不必忽略证书验证?如果没有,我在代码中做错了什么?


共有2个答案

秦博延
2023-03-14

你正在这样做:

// 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结合使用。

仉联
2023-03-14

Golang使用OS证书存储。以下注释表明Go在Windows上使用Windows应用商店,类似于Linux。

//CertGet证书链将遍历Windows的根存储,试图构建经过验证的证书链

此注释和相关代码位于以下文件中:

https://golang.org/src/crypto/x509/root_windows.go

将服务器证书、中间CA证书和/或根CA证书添加到Windows XP证书存储库。您可以使用IBM发布的以下Windows XP说明:

程序

  1. 从Windows XP中,选择开始

裁判:https://www.ibm.com/docs/en/b2b-integrator/5.2?topic=xp-在windows中安装根证书

GlobalSign和Secure为更现代的Windows版本提供了类似的说明,但上面的IBM链接是专门针对Windows XP的。下面的安全文档还包括屏幕截图。

  • 导入和导出证书-Microsoft Windows
  • 如何在Windows上手动安装Securly SSL证书-包括屏幕截图
 类似资料:
  • 我有一个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的证书存在问题,一切正常:( 我做了很