Как использовать самозаверяющий сертификат через клиент прокси-сервера - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь создать 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
}

1 Ответ

0 голосов
/ 26 ноября 2018

«Есть ли проблема»?Только если вы считаете, что доверять сертификату вслепую (вот почему он называется Небезопасный SkipVerify).

Лучший вариант - настроить клиент для доверия определенному сертификату, который использует сервер,таким образом, вы получаете защиту MITM в дополнение к шифрованию.

Для этого получите копию сертификата сервера по доверенному каналу (например, скопируйте его из файловой системы сервера), затем добавьте ее в пул CA клиента (это также будет доверять всем сертификатам, подписанным сертификатом сервера, если применимо).

Вот пример для тестового сертификата в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...