Ssl 如何在go中测试HTTPS端点?

Ssl 如何在go中测试HTTPS端点?,ssl,testing,go,Ssl,Testing,Go,因此,我尝试使用httptest.TLSServer模拟对https请求的响应,但是发出请求的http.Client不断告诉我服务器给出了无效的http响应。我打赌这是因为没有实际的SSL证书。有没有办法让客户端在模拟https请求时忽略tls 有问题的测试代码 func TestFacebookLogin(t *testing.T) { db := glob.db server := httptest.NewTLSServer(http.HandlerFunc(func(w h

因此,我尝试使用
httptest.TLSServer
模拟对https请求的响应,但是发出请求的
http.Client
不断告诉我服务器给出了无效的http响应。我打赌这是因为没有实际的SSL证书。有没有办法让客户端在模拟https请求时忽略tls

有问题的测试代码

func TestFacebookLogin(t *testing.T) {
    db := glob.db
    server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        resp := `
        {
          "id": "123",
          "email": "blah",
          "first_name": "Ben",
          "last_name": "Botwin"
        }
        `

        w.Write([]byte(resp))
    }))
    defer server.Close()

    transport := &http.Transport{
        Proxy: func(r *http.Request) (*url.URL, error) {
            return url.Parse(server.URL)
        },
    }

    svc := userService{db: db, client: &http.Client{Transport: transport}}

    _, err := svc.FacebookLogin("asdf")

    if err != nil {
        t.Errorf("Error found: %s", err)
    }

}
我想提出的要求是:

url := "https://<Some facebook api endpoint>"
req, err := http.NewRequest("GET", url, nil)
resp, err := client.Do(req)
if err != nil {
    return nil, err
}
defer resp.Body.Close()
url:=“https://”
req,err:=http.NewRequest(“GET”,url,nil)
resp,err:=client.Do(请求)
如果出错!=零{
返回零,错误
}
延迟响应主体关闭()

测试服务器使用自签名证书。有两种方法可以避免错误。第一种是使用配置了以下各项的HTTP客户端:

更简单的选择是跳过证书验证:

client := http.Client{
    Transport: &http.Transport{
        TLSClientConfig: &tls.Config{
            InsecureSkipVerify: true,
        },
    },
}

还有一个问题。客户机希望连接到代理服务器,但实际上它直接连接到测试服务器。尝试挂接拨号功能而不是代理:

client := http.Client{
    Transport: &http.Transport{
        Dial: func(network, addr string) (net.Conn, error) {
            return net.Dial("tcp", server.URL[strings.LastIndex(server.URL, "/")+1:])
        },
        TLSClientConfig: &tls.Config{
            InsecureSkipVerify: true,
        },
    },
}

测试服务器使用自签名证书。有两种方法可以避免错误。第一种是使用配置了以下各项的HTTP客户端:

更简单的选择是跳过证书验证:

client := http.Client{
    Transport: &http.Transport{
        TLSClientConfig: &tls.Config{
            InsecureSkipVerify: true,
        },
    },
}

还有一个问题。客户机希望连接到代理服务器,但实际上它直接连接到测试服务器。尝试挂接拨号功能而不是代理:

client := http.Client{
    Transport: &http.Transport{
        Dial: func(network, addr string) (net.Conn, error) {
            return net.Dial("tcp", server.URL[strings.LastIndex(server.URL, "/")+1:])
        },
        TLSClientConfig: &tls.Config{
            InsecureSkipVerify: true,
        },
    },
}

可能重复的可能重复现在我收到一个奇怪的错误响应错误。知道为什么吗?@thecodethinker我需要更多的信息来确定可能的错误。我提供了两个测试https的工作程序。从其中一个开始。当我尝试使用
unsecureskipverify
进行测试时,我得到了这个错误
格式错误的HTTP响应“\x15\x03\x01\x00\x02\x02\x16”
。你知道那是什么吗?哦,这是另一个问题,测试服务器用TLS握手响应,但是客户端期望来自代理的HTTP响应。请参阅更新的答案以获得修复。为什么您只希望在
拨号
呼叫中使用
/
字符后面的内容?现在我收到一个奇怪的错误响应。知道为什么吗?@thecodethinker我需要更多的信息来确定可能的错误。我提供了两个测试https的工作程序。从其中一个开始。当我尝试使用
unsecureskipverify
进行测试时,我得到了这个错误
格式错误的HTTP响应“\x15\x03\x01\x00\x02\x02\x16”
。你知道那是什么吗?哦,这是另一个问题,测试服务器用TLS握手响应,但是客户端期望来自代理的HTTP响应。请参阅更新的答案以了解修复方法。为什么您只想在
拨号
呼叫中使用
/
字符后面的内容?