为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕桂英4014372 2021-12-13 18:22:28
在 Go 中,我使用 NewSingleHostReverseProxy 来执行反向代理,但是我需要确认主机站点的 SSL 证书,以确保我拥有正确的安全证书......我应该怎么做?我应该用处理程序还是运输工具来做这件事?我是 Go 的新手,但仍然对它有所了解。proxy := httputil.NewSingleHostReverseProxy(&url.URL{         Scheme: "https",         Host:   "sha256.badssl.com",})http.ListenAndServe("127.0.0.1:80", proxy)
查看完整描述

2 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

要访问证书,您将可以访问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

}


查看完整回答
反对 回复 2021-12-13
?
九州编程

TA贡献1785条经验 获得超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)


查看完整回答
反对 回复 2021-12-13
  • 2 回答
  • 0 关注
  • 398 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信