我创建了一个负载均衡器,它查找所提供服务器的 IP 地址,然后执行反向代理:
func loadBalancer(w http.ResponseWriter, r *http.Request) {
ip := getIP()
proxy := httputil.ReverseProxy{
Rewrite: func(proxyRequest *httputil.ProxyRequest) {
proxyRequest.SetURL(&url.URL{
Scheme: "https",
Host: ip.String(),
})
proxyRequest.Out.Host = proxyRequest.In.Host
},
}
proxy.ServeHTTP(w, r)
}
理论上它可以工作,但我遇到了 TLS 证书问题。由于证书仅颁发给域名而不是 IP 地址,因此证书验证失败:
http: proxy error: tls: failed to verify certificate: x509: cannot validate certificate for <IP> because it doesn't contain any IP SANs
我该如何解决这个问题?
在反向代理的hosts文件中,例如。如果存在三台后端主机,则输入三台后端主机的内部 FQDN 及其各自的内部 IP 地址。当您形成后端的 URL 时,应该类似于 https://host1.intra.app。此方法需要 X509 证书,CN = www.app.net,SAN(主题备用名称)= host1.intra.app、host2.intra.app、host3.intra.app,其中 www.app.net 是用户已知的应用程序名称。
如果这个新的 x509 证书是由已知的根 CA 提供的,则可能会产生额外费用。
如果您有内部证书颁发机构,您可以在此证书颁发机构上生成此证书,并将此证书和私钥分发到反向代理(假设第一个 TLS 解密发生在反向代理处)和所有后端主机。内部证书颁发机构的证书(CA 证书)应存在于使用该应用程序的每台设备和所有应用程序服务器的受信任根存储中。