在golang中使用client.crt和client.key发出的https请求

时间:2019-02-19 15:41:58

标签: ssl go curl https

我想将POST请求发送到https服务器并获取响应。这是我在卷曲时所做的事情,效果很好。

curl --key ./client.key --cert ./client.crt https://test-as.sgx.trustedservices.intel.com:443/attestation/sgx/v2/report -H 'Content-Type: application/json' --data '{"key": "value"}'

这是我在Golang中尝试过的代码段

    url := "https://test-as.sgx.trustedservices.intel.com:443/attestation/sgx/v2/report"
    pair, e := tls.LoadX509KeyPair("client.crt", "client.key")
    if e != nil {
        log.Fatal("LoadX509KeyPair:", e)
    }

    client := &http.Client{
        Transport: &http.Transport{
            TLSClientConfig: &tls.Config{
                InsecureSkipVerify: true,
                Certificates: []tls.Certificate{pair},
            },
        }}

    resp, e := client.Post(url, "application/json", bytes.NewBufferString(payload))

程序挂在最后一行,错误消息是

Post: dial tcp connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

我觉得我的连接建立代码有问题,而不是服务器的问题,因为服务器可以完美地与curl配合使用。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

首先,无论看上去多么方便, 永远不会 使用InsecureSkipVerify: true。而是设置类似以下内容:

tls.Config {
    ServerName: "test-as.sgx.trustedservices.intel.com",
    Certificates: []tls.Certificate{pair}
}

第二步,初始化http.Transport-通过自定义tls.Config-还将默认http.Transport随附的所有其他默认http.Client设置清零。

其中一些零默认值可能会强制执行您可能无法预期的行为。 请参阅here,了解如何恢复其中的一些默认设置。