julienschmidtによるhttprouterなどのリバースプロキシを使用しているときに、特定のホストにTLS / SSLクライアント認証を使用するにはどうすればよいですか?
でグローバルな問題にクライアント証明書を設定できましたhttp.DefaultTransport
。
transport := &http.Transport{
TLSClientConfig: &tls.Config{
Certificates: []tls.Certificate{cert},
},
}
http.DefaultTransport = transport
ただし、次のような特定のホストに対してのみクライアント証明書を使用したい場合:
コールバックGetConfigForClientHandler
またはコールされることを期待していましたGetCertificateHandler
。この時点で、に反応することができましたinfo.ServerName
。ただし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
を使用しますhttp.Serve
(ここでhttprouterを使用できます)この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加