当使用像 httprouter by julienschmidt 这样的反向代理时,如何对特定主机使用 TLS/SSL 客户端身份验证?
我可以使用 http.DefaultTransport
在全局事务中设置客户端证书.
transport := &http.Transport{
TLSClientConfig: &tls.Config{
Certificates: []tls.Certificate{cert},
},
}
http.DefaultTransport = transport
但只想将客户端证书用于 特定主机 , 喜欢:更新
我预计回调
GetConfigForClientHandler
或者GetCertificateHandler
会被调用。在这一点上,我可以对 info.ServerName
使用react.但只有 GetClientCertificate
在没有关于目标的信息的情况下被调用 info.ServerName
.func main() {
transport := &http.Transport{
TLSClientConfig: &tls.Config{
GetConfigForClient: GetConfigForClientHandler,
GetClientCertificate: GetClientCertificateHandler,
GetCertificate: GetCertificateHandler,
},
}
http.DefaultTransport = transport
// Host which enforce client certificate authentication
resp, err := http.Get("https://example.com")
if err != nil {
fmt.Println("Error", err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
func GetClientCertificateHandler(info *tls.CertificateRequestInfo) (*tls.Certificate, error) {
fmt.Println("GetClientCertificateHandler")
panic("GetClientCertificateHandler")
}
func GetConfigForClientHandler(info *tls.ClientHelloInfo) (*tls.Config, error) {
fmt.Println("GetConfigForClientHandler for:", info.ServerName)
panic("GetConfigForClientHandler")
}
func GetCertificateHandler(info *tls.ClientHelloInfo) (*tls.Certificate, error) {
fmt.Println("GetCertificateHandler for:", info.ServerName)
panic("GetCertificateHandler")
}
最佳答案
Config.GetConfigForClient
处理程序。 ClientHelloInfo.ServerName
.那是请求的主机。然后修改 TLS 配置以要求客户端身份验证 ( Config.ClientAuth
)。 tls.NewListener
包裹你的 net.Listener net.Listener
在 http.Serve
(这里是你可以使用 httprouter 的地方)关于go - 对特定主机使用 TLS/SSL 客户端身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63213638/