Http 如何通过代理服务器客户端使用自签名证书

Http 如何通过代理服务器客户端使用自签名证书,http,go,https,proxy,Http,Go,Https,Proxy,我正在尝试创建一个HTTP客户端,它可以通过代理服务器发送自签名HTTP请求 我尝试了这段代码,但我不确定这里是否有问题,下面的代码可以工作吗 func CreateProxyClient(serverProxy string, sid string, portProxy int) (*Client, error) { http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSki

我正在尝试创建一个HTTP客户端,它可以通过代理服务器发送自签名HTTP请求

我尝试了这段代码,但我不确定这里是否有问题,下面的代码可以工作吗

func CreateProxyClient(serverProxy string, sid string, portProxy int) (*Client, error) {
    http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}

    proxyUrl, _ := url.Parse(serverProxy+":"+strconv.Itoa(portProxy))
    tr := &http.Transport{
        Proxy: http.ProxyURL(proxyUrl),
    }
    var netClient = &http.Client{
        Timeout: time.Second * 10,
        Transport: tr,
    }
    return &Client{netClient, serverProxy, sid}, nil
}
“有问题吗”?只有当您认为盲目信任证书是一个问题(这就是为什么它被称为虫虫验证)时。

更好的选择是将客户端配置为信任服务器正在使用的特定证书,这样除了加密之外,还可以获得MITM保护

为此,请通过受信任的通道获取服务器证书的副本(例如,从服务器的文件系统复制),然后将其添加到客户端的CA池(如果适用,这也将信任由服务器证书签名的所有证书)

以下是的示例,由以下人员使用:


在操场上试一试:

您可以自己试一试,让我们知道您在执行代码时遇到的问题或收到的错误。这样,检查代码就更容易了,否则我们将使用代理服务器自己编写一个示例代码来测试您的代码。
package main

import (
    "crypto/tls"
    "crypto/x509"
    "fmt"
    "log"
    "net/http"
    "net/http/httptest"
)

// cert is used by httptest.NewTLSServer.
//
// In a real application you're going to want to load the certificate from
// disk, rather than hard-coding it. Otherwise you have to recompile the program
// when the certificate is updated.
var cert = []byte(`-----BEGIN CERTIFICATE-----
MIICEzCCAXygAwIBAgIQMIMChMLGrR+QvmQvpwAU6zANBgkqhkiG9w0BAQsFADAS
MRAwDgYDVQQKEwdBY21lIENvMCAXDTcwMDEwMTAwMDAwMFoYDzIwODQwMTI5MTYw
MDAwWjASMRAwDgYDVQQKEwdBY21lIENvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
iQKBgQDuLnQAI3mDgey3VBzWnB2L39JUU4txjeVE6myuDqkM/uGlfjb9SjY1bIw4
iA5sBBZzHi3z0h1YV8QPuxEbi4nW91IJm2gsvvZhIrCHS3l6afab4pZBl2+XsDul
rKBxKKtD1rGxlG4LjncdabFn9gvLZad2bSysqz/qTAUStTvqJQIDAQABo2gwZjAO
BgNVHQ8BAf8EBAMCAqQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUw
AwEB/zAuBgNVHREEJzAlggtleGFtcGxlLmNvbYcEfwAAAYcQAAAAAAAAAAAAAAAA
AAAAATANBgkqhkiG9w0BAQsFAAOBgQCEcetwO59EWk7WiJsG4x8SY+UIAA+flUI9
tyC4lNhbcF2Idq9greZwbYCqTTTr2XiRNSMLCOjKyI7ukPoPjo16ocHj+P3vZGfs
h1fIw3cSS2OolhloGw/XM6RWPWtPAlGykKLciQrBru5NAPvCMsb/I1DAceTiotQM
fblo6RBxUQ==
-----END CERTIFICATE-----`)

func main() {
    pool, err := x509.SystemCertPool()
    if err != nil {
        log.Fatal(err)
    }
    if !pool.AppendCertsFromPEM(cert) {
        log.Fatal("Cannot append self-signed cert to CA pool")
    }

    c := &http.Client{
        Transport: &http.Transport{
            TLSClientConfig: &tls.Config{
                RootCAs: pool,
            },
        },
    }

    s := httptest.NewTLSServer(nil)
    res, err := c.Get(s.URL)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(res.Status)
}