猿问

在 GoLang 中执行 ReverseProxy 时确认 TLS 证书

在 Go 中,我使用 NewSingleHostReverseProxy 来执行反向代理,但是我需要确认主机站点的 SSL 证书,以确保我拥有正确的安全证书......我应该怎么做?我应该用处理程序还是运输工具来做这件事?我是 Go 的新手,但仍然对它有所了解。


proxy := httputil.NewSingleHostReverseProxy(&url.URL{

         Scheme: "https",

         Host:   "sha256.badssl.com",

})


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


慕桂英4014372
浏览 399回答 2
2回答

吃鸡游戏

要访问证书,您将可以访问ConnectionState。最简单的方法是提供您自己的DialTLS版本。在那里你使用net.Dial连接到服务器,进行 TLS 握手,然后你可以自由验证。package mainimport (    "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}

九州编程

要将 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)
随时随地看视频慕课网APP

相关分类

Go
我要回答