我想将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配合使用。
感谢您的帮助!
答案 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,了解如何恢复其中的一些默认设置。