在使用GoLang进行反向代理时确认TLS证书

5
在 Go 中,我使用 NewSingleHostReverseProxy 来执行反向代理,但是我需要确认主站点的 SSL 证书,以确保我有正确的安全证书...有什么想法应该如何做这件事吗?我应该使用处理程序或传输进行此操作吗?我对 Go 还很陌生,还在努力理解它。
proxy := httputil.NewSingleHostReverseProxy(&url.URL{
         Scheme: "https",
         Host:   "sha256.badssl.com",
})

http.ListenAndServe("127.0.0.1:80", proxy)
2个回答

8

要访问证书,您需要获得对ConnectionState的访问权限。最简单的方法是提供自己版本的DialTLS。在那里,您使用net.Dial连接到服务器,执行TLS握手,然后就可以进行验证。

package main

import (
    "crypto/tls"
    "log"
    "net"
    "net/http"
    "net/http/httputil"
    "net/url"
)

func main() {
    proxy := httputil.NewSingleHostReverseProxy(&url.URL{
        Scheme: "https",
        Host:   "sha256.badssl.com",
    })

    // Set a custom DialTLS to access the TLS connection state
    proxy.Transport = &http.Transport{DialTLS: dialTLS}

    // Change req.Host so badssl.com host check is passed
    director := proxy.Director
    proxy.Director = func(req *http.Request) {
        director(req)
        req.Host = req.URL.Host
    }

    log.Fatal(http.ListenAndServe("127.0.0.1:3000", proxy))
}

func dialTLS(network, addr string) (net.Conn, error) {
    conn, err := net.Dial(network, addr)
    if err != nil {
        return nil, err
    }

    host, _, err := net.SplitHostPort(addr)
    if err != nil {
        return nil, err
    }
    cfg := &tls.Config{ServerName: host}

    tlsConn := tls.Client(conn, cfg)
    if err := tlsConn.Handshake(); err != nil {
        conn.Close()
        return nil, err
    }

    cs := tlsConn.ConnectionState()
    cert := cs.PeerCertificates[0]

    // Verify here
    cert.VerifyHostname(host)
    log.Println(cert.Subject)

    return tlsConn, nil
}

4

要调整SSL到反向主机,可以设置传输选项。因此,如果您想跳过验证,可以像这样设置。

proxy := httputil.NewSingleHostReverseProxy(&url.URL{
         Scheme: "https",
         Host:   "sha256.badssl.com",
})

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

http.ListenAndServe("127.0.0.1:80", proxy)

2
请在您的答案周围添加更多描述。这对未来的用户会很有帮助。 - Sangam Belose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接