如何在Go ReverseProxy中使用TLS?

时间:2017-08-08 03:47:53

标签: ssl go reverse-proxy

我的网站https://a-b-c.comhttps://www.x-y-z.com分别在端口44445555上的反向代理后面运行。

我让他们配置为使用letsencrypt tls证书,但现在我在使用反向代理时遇到错误,我想我需要使用包含其证书的&tls.config{}但我不知道如何设置它了。

我的ReverseProxy看起来像:

  director := func(req *http.Request) {                        
    log.Println(req.Host)                                      
    switch req.Host {                                          
    case "a-b-c-.com":                                 
      req.URL.Host = "localhost:4444"                        
      req.URL.Scheme = "https"                                 
    case "x-y-z.com":                                   
      req.URL.Host = "localhost:5555"                           
      req.URL.Scheme = "https"                                                                                   
  }                                                            
  proxy := &httputil.ReverseProxy{Director: director}          
  proxy.Transport = &http.Transport{                           
    Proxy: http.ProxyFromEnvironment,                          
    Dial: (&net.Dialer{                                        
      Timeout:   30 * time.Second,                             
      KeepAlive: 30 * time.Second,                             
    }).Dial,                                                   
    TLSHandshakeTimeout: 10 * time.Second,                     
    TLSClientConfig:     &tls.Config{InsecureSkipVerify: true},
  }                                                            

  log.Fatalln(http.ListenAndServe(":443", proxy))              

1 个答案:

答案 0 :(得分:0)

您不必设置反向代理。您需要做的是设置将反向代理附加到的HTTP服务器。

通过传递两对证书/密钥来配置TLS侦听器:

abcCrt, err := tls.LoadX509KeyPair("a-b-c.crt", "a-b-c.key")
if err != nil {
  panic(err)
}

xyzCrt, err := tls.LoadX509KeyPair("x-y-z.crt", "z-y-z.key")
if err != nil {
  panic(err)
}

tlsConfig := &tls.Config{Certificates: []tls.Certificate{abcCrt, xyzCrt}}
ln, err := tls.Listen("tcp", ":443", tlsConfig) 
if err != nil {
  panic(err)
}

http.Serve(ln, proxy)