【问题标题】:tls: no renegotiation error on HTTP requesttls:HTTP 请求没有重新协商错误
【发布时间】:2019-08-08 21:27:56
【问题描述】:

我正在尝试在 Go 中发出一个简单的 HTTP 请求,但在直接按照指南操作后,我不断收到相同的错误:

local error: tls: no renegotiation

我不太明白如何解释?我知道这在服务器上不是问题,因为当我从 python 调用相同的请求时它返回正常。这是我的代码:

package main

import (
    "fmt"
    "net/http"
    "net/url"
    "strings"
    "time"
)

func main() {
    timeout := time.Duration(20 * time.Second)
    client := &http.Client{
        Timeout: timeout,
    }
    data := url.Values{
        "top":   {"10"},
        "lDate": {"2019-01-01"},
    }
    req, err := http.NewRequest("POST", "https://api.*********.com/AppAvailLoads?", strings.NewReader(data.Encode()))
    if err != nil {
        fmt.Println("Error in construction")
    }
    req.Header.Add("x-cdata-authtoken", "********")
    req.Header.Add("content-type", "application/x-www-form-urlencoded")
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error in request")
        fmt.Println(err)
    } else {
        fmt.Println(resp.Body)
        resp.Body.Close()
    }
}

【问题讨论】:

    标签: go go-http


    【解决方案1】:

    解决方案是启用 TLS 重新协商(图,我知道),这是 tls 包中的一个常量,如下所示:

    tr := &http.Transport{
            TLSClientConfig: &tls.Config{
                Renegotiation:      tls.RenegotiateOnceAsClient,
                InsecureSkipVerify: true},
        }
    
    client := &http.Client{
            Timeout:   timeout,
            Transport: tr,
        }
    

    这很奇怪,因为没有在线指南对此进行解释或显示常见错误(例如local error: tls: no renegotiation)如何发生的示例。我希望这对来自其他语言的人有用,因为这不是一个通常处理的事情!

    【讨论】:

    • 如果你希望你也可以让你的连接实际使用 tls 而不是在你给出“InsecureSkipVerify: true”时放弃这个安全级别......你是否拥有 api 服务器并可以访问它的公共证书?如果是这样,则需要多几行才能通过安全的 tls 连接来连接 http.Client
    • 我可以确认不需要 InsecureSkipVerify 来解决 tls 重新协商问题,但是如果您使用不受信任的域,例如对于您的测试服务器,那么您可以设置它。
    • 谢谢你,重新协商:tls.RenegotiateOnceAsClient,保障了我的工作时间。
    猜你喜欢
    • 2016-03-01
    • 1970-01-01
    • 2016-03-09
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 2019-03-01
    相关资源
    最近更新 更多