登录
首页 >  Golang >  Go问答

利用代理服务器客户端来访问自签名证书

来源:stackoverflow

时间:2024-03-07 13:54:24 142浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《利用代理服务器客户端来访问自签名证书》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

我正在尝试创建一个可以通过代理服务器发送自签名 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
}

解决方案


“有问题吗”?仅当您认为盲目信任证书有问题时(这就是它被称为不安全skipverify 的原因)。

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

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

以下是 the test certificate in net/http 的示例,由 httptest.NewTLSServer 使用:

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)
}

尝试一下演示:https://play.golang.org/p/HsI2RyOd5qd

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>