获取net / http:TLS握手超时golang

时间:2015-11-07 01:59:36

标签: ssl go https timeout handshake

需要你的帮助

package main

import (
    "log"
    "net/http"
)

func main() {
    client := &http.Client{}
    _, err := client.Get("https://www.marathonbet.com/en/")
    if err != nil {
        log.Fatalf("%s\n", err)
    }
}

这总是返回:Get https://www.marathonbet.com/en/: net/http: TLS handshake timeout exit status 1 我试试:     it 并使用this lib 做it {{3}} 但没有什么对我有用.. 所以,请帮助我。

更新: 在带有请求的Python 2.7中,这有效:

s = Session()
r = s.get('https://www.marathonbet.com/en/, verify=False)

但我需要去做(

UPD: 修复:只需将https://www.marathonbet.com/en/重新添加到https://87.117.250.213/en/并添加skip verify即可。 求你帮忙。

2 个答案:

答案 0 :(得分:0)

这是对正在发生的事情的更详细的解释。当您调用域时,您的 HTTP 客户端会调用 DNS 服务器。 DNS 服务器以目标服务器的 IP 响应。此时一切正常。

如果是 HTTPS 连接,则开始 TLS 握手。这是它的工作原理。

TLS handshake

这就是您遇到问题的地方。请求已发送,但服务器没有正确回答(或根本没有回答)。可能是服务器等多种因素造成的:

  • 无法访问
  • 需要更多时间来回复
  • 可以隐藏在一些拒绝连接的防火墙/代理后面
  • 阻止来自您的 IP/位置的所有请求

通过提供 skip verify 选项并提供显式 IP 地址,您可以跳过我上面描述的所有内容。这意味着:

  • 如果服务器的 IP 发生变化,您的代码将停止工作
  • 如果有人表演了man-in-the-middle attach,你就不会发现。

如果不进行更深入的调查,很难找出根本原因。如果您想了解发生了什么,请使用 @Flowchartsman 建议的 httptrace

答案 1 :(得分:-2)

禁用验证

package main

import (
    "crypto/tls"
    "fmt"
    "io/ioutil"
    "net/http"
    "os"
)

func main() {
    // Create New http Transport
    transCfg := &http.Transport{
        TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // disable verify
    }
    // Create Http Client
    client := &http.Client{Transport: transCfg}
    // Request
    response, err := client.Get("https://www.marathonbet.com/en/")
    // Check Error
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    // Close After Read Body
    defer response.Body.Close()
    // Read Body
    data, err := ioutil.ReadAll(response.Body)
    // Check Error
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    // Print response html : conver byte to string
    fmt.Println(string(data))

}