gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:10:18 58 4
gpt4 key购买 nike

在 Go 中,我使用 NewSingleHostReverseProxy 来执行反向代理,但是我需要确认主机站点的 SSL 证书,以确保我拥有正确的安全证书......我应该如何做?我应该与处理程序或传输一起执行此操作吗?我是 Go 的新手,但仍在思考它。

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

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

最佳答案

要访问证书,您将有权访问 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
}

关于ssl - 在 GoLang 中执行 ReverseProxy 时确认 TLS 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35390726/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com