Golang1.5的httpclient遇到紧急Bug!在线等!急!
Golang1.5的httpclient遇到紧急Bug!在线等!急! 使用Go的http客户端请求HTTPS时遇到的问题,我确信这不是所访问的HTTPS服务器的证书问题,因为使用Postman和curl发送相同参数都是正常的。我认为这是Go 1.5版本中的一个bug。
$ go env
set GO111MODULE=on
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\1\AppData\Local\go-build
set GOENV=C:\Users\1\AppData\Roaming\go\env
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=F:\go\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=F:\go
set GOPRIVATE=
set GOPROXY=https://goproxy.io,direct
set GOROOT=D:\go
set GOSUMDB=off
set GOTMPDIR=
set GOTOOLDIR=D:\go\pkg\tool\windows_amd64
set GCCGO=gccgo
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=NUL
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\1\AppData\Local\Temp\go-build947164270=/tmp/go-build -gno-record-gcc-switches
$ go version
go version go1.15 windows/amd64
Go代码
package main
import (
"fmt"
"strings"
"net/http"
"io/ioutil"
)
func main() {
url := "https://api.cmburl.cn:8065/ect/cbl-v2.0-uat/order-pay"
method := "POST"
payload := strings.NewReader(`{"orderExtendPayDto":{"accInputType":"01","payerIssrId":"","transChannelType":"01","transIp":"::1","transTerminalType":"07"},"orderInfoPayDto":{"appId":"f2275583-0e92-42f7-89c5-47a3d4f640e7","asyncNtfUrl":"http://code.itc.cmbchina.cn/LSSD/lu84_polypay_alipay/commits/dev","frontNtfUrl":"http://99.11.3.152:8080/test-show","mchNbr":"755936044710301","mchOrderNbr":"595342639696449536","mchTransNbr":"5953426396964495361616743634","orderAmt":"0.01","orderCcyNbr":"10","orderPostTime":"20210326152714","orderRemark":"订单支付0.01元","orderSubtype":"DRT","orderType":"PAY","payerIssrId":"","pltNbr":"C000000137","pltRemark":"测试支付","urlTimeLimit":30}}`)
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Appid", "f2275583-0e92-42f7-89c5-47a3d4f640e7")
req.Header.Add("Timestamp", "1616743634")
req.Header.Add("Sign", "b68c0085fa49e2f3b1361419699a917d92f552b78e38ddfbcdf4b5fbac7ee065")
req.Header.Add("Apisign", "jDEd9a5XUDmugMfuDRLjVSbKM6E1QCO4XS3yF6eWdOVulj+kkHQGgyDNDrKRRE4R3oUfc1H4kyBySNC9cvstYT0nFDUR34wpCGHh6PgRpezznOd91ogTsdF2o9fAir2blU+zbNokJuCKrq/CJ2xEwyXdunWuuiRyVw4iXEqXdWoSfJTkE7Dj9JbCNX3GdW499dQUbeIJ0sNeYHch6oSsBWLcrvL6EXprtfQAFYAPsPAnzdWXxmVkJjeye44kv5zEuTu993iIvseH8GU0giMjEV+FmHh1s7TO1ZEVdCa3R0o8gWkXUDXGa79qQLoB529+BKwoL5+NgeH5oCYSWHXbuQ==")
req.Header.Add("Version", "1.0")
req.Header.Add("Datetime", "2021-03-26 15:27:14")
req.Header.Add("Content-Type", "application/json")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
curl代码(成功)
curl --location --request POST 'https://api.cmburl.cn:8065/ect/cbl-v2.0-uat/order-pay' \
--header 'Appid: f2275583-0e92-42f7-89c5-47a3d4f640e7' \
--header 'Timestamp: 1616743634' \
--header 'Sign: b68c0085fa49e2f3b1361419699a917d92f552b78e38ddfbcdf4b5fbac7ee065' \
--header 'Apisign: jDEd9a5XUDmugMfuDRLjVSbKM6E1QCO4XS3yF6eWdOVulj+kkHQGgyDNDrKRRE4R3oUfc1H4kyBySNC9cvstYT0nFDUR34wpCGHh6PgRpezznOd91ogTsdF2o9fAir2blU+zbNokJuCKrq/CJ2xEwyXdunWuuiRyVw4iXEqXdWoSfJTkE7Dj9JbCNX3GdW499dQUbeIJ0sNeYHch6oSsBWLcrvL6EXprtfQAFYAPsPAnzdWXxmVkJjeye44kv5zEuTu993iIvseH8GU0giMjEV+FmHh1s7TO1ZEVdCa3R0o8gWkXUDXGa79qQLoB529+BKwoL5+NgeH5oCYSWHXbuQ==' \
--header 'Version: 1.0' \
--header 'Datetime: 2021-03-26 15:27:14' \
--header 'Content-Type: application/json' \
--data-raw '{"orderExtendPayDto":{"accInputType":"01","payerIssrId":"","transChannelType":"01","transIp":"::1","transTerminalType":"07"},"orderInfoPayDto":{"appId":"f2275583-0e92-42f7-89c5-47a3d4f640e7","asyncNtfUrl":"http://code.itc.cmbchina.cn/LSSD/lu84_polypay_alipay/commits/dev","frontNtfUrl":"http://99.11.3.152:8080/test-show","mchNbr":"755936044710301","mchOrderNbr":"595342639696449536","mchTransNbr":"5953426396964495361616743634","orderAmt":"0.01","orderCcyNbr":"10","orderPostTime":"20210326152714","orderRemark":"订单支付0.01元","orderSubtype":"DRT","orderType":"PAY","payerIssrId":"","pltNbr":"C000000137","pltRemark":"测试支付","urlTimeLimit":30}}'
更多关于Golang1.5的httpclient遇到紧急Bug!在线等!急!的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
我建议使用 Go 1.16。 Go 1.5 版本已经非常陈旧了。
如果问题仍然存在,请将你的代码发给我们看看…
更多关于Golang1.5的httpclient遇到紧急Bug!在线等!急!的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这个问题不是Go 1.5的bug,而是Go 1.5版本中TLS握手默认配置的变化导致的。从Go 1.5开始,标准库的crypto/tls包默认不再支持SSLv3,并且对TLS配置有更严格的要求。
你的代码中使用了默认的http.Client,这会导致TLS握手失败。需要显式配置TLS设置来解决问题:
package main
import (
"crypto/tls"
"fmt"
"net/http"
"strings"
"io/ioutil"
)
func main() {
url := "https://api.cmburl.cn:8065/ect/cbl-v2.0-uat/order-pay"
method := "POST"
payload := strings.NewReader(`{"orderExtendPayDto":{"accInputType":"01","payerIssrId":"","transChannelType":"01","transIp":"::1","transTerminalType":"07"},"orderInfoPayDto":{"appId":"f2275583-0e92-42f7-89c5-47a3d4f640e7","asyncNtfUrl":"http://code.itc.cmbchina.cn/LSSD/lu84_polypay_alipay/commits/dev","frontNtfUrl":"http://99.11.3.152:8080/test-show","mchNbr":"755936044710301","mchOrderNbr":"595342639696449536","mchTransNbr":"5953426396964495361616743634","orderAmt":"0.01","orderCcyNbr":"10","orderPostTime":"20210326152714","orderRemark":"订单支付0.01元","orderSubtype":"DRT","orderType":"PAY","payerIssrId":"","pltNbr":"C000000137","pltRemark":"测试支付","urlTimeLimit":30}}`)
// 创建自定义Transport,配置TLS设置
tr := &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true, // 跳过证书验证(仅用于测试)
// 或者使用更安全的配置:
// MinVersion: tls.VersionTLS12,
// CipherSuites: []uint16{
// tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
// tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
// },
},
}
client := &http.Client{
Transport: tr,
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Appid", "f2275583-0e92-42f7-89c5-47a3d4f640e7")
req.Header.Add("Timestamp", "1616743634")
req.Header.Add("Sign", "b68c0085fa49e2f3b1361419699a917d92f552b78e38ddfbcdf4b5fbac7ee065")
req.Header.Add("Apisign", "jDEd9a5XUDmugMfuDRLjVSbKM6E1QCO4XS3yF6eWdOVulj+kkHQGgyDNDrKRRE4R3oUfc1H4kyBySNC9cvstYT0nFDUR34wpCGHh6PgRpezznOd91ogTsdF2o9fAir2blU+zbNokJuCKrq/CJ2xEwyXdunWuuiRyVw4iXEqXdWoSfJTkE7Dj9JbCNX3GdW499dQUbeIJ0sNeYHch6oSsBWLcrvL6EXprtfQAFYAPsPAnzdWXxmVkJjeye44kv5zEuTu993iIvseH8GU0giMjEV+FmHh1s7TO1ZEVdCa3R0o8gWkXUDXGa79qQLoB529+BKwoL5+NgeH5oCYSWHXbuQ==")
req.Header.Add("Version", "1.0")
req.Header.Add("Datetime", "2021-03-26 15:27:14")
req.Header.Add("Content-Type", "application/json")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
如果服务器使用的是较旧的TLS版本或特定的密码套件,可以尝试更详细的TLS配置:
tr := &http.Transport{
TLSClientConfig: &tls.Config{
MinVersion: tls.VersionTLS10, // 支持TLS 1.0
MaxVersion: tls.VersionTLS13, // 支持TLS 1.3
CipherSuites: []uint16{
tls.TLS_RSA_WITH_AES_128_CBC_SHA,
tls.TLS_RSA_WITH_AES_256_CBC_SHA,
tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
},
},
}
要查看具体的TLS握手错误,可以添加错误处理:
res, err := client.Do(req)
if err != nil {
if uerr, ok := err.(*url.Error); ok {
if terr, ok := uerr.Err.(*tls.RecordHeaderError); ok {
fmt.Printf("TLS错误: %v\n", terr)
}
}
fmt.Printf("请求错误: %v\n", err)
return
}

