2015年9月10日 星期四

使用Go 做反向代理伺服器

使用Go作反向代理,可以使用go 自帶的reverse proxy
但是如果背後的http server是走https的話,你又是用自簽憑證那你就會遇到inseurce verify的問題

解法就是取代原本reverse proxy自帶的client transport設定

package main import (
"net/http"
"net/http/httputil"
"net/url"
"time"
"net"
"log"
"fmt"
"crypto/tls"
)
func main() {
go ReverseHttpsProxy(445,"https://127.0.0.1:443/","my.crt","my.key")
ReverseHttpProxy(8081,"http://127.0.0.1:8080/")
}
func ReverseHttpsProxy(port int,dst string,crt string,key string) {
u, e := url.Parse(dst)
if e != nil {
log.Fatal("Bad destination.")
}
h := httputil.NewSingleHostReverseProxy(u)
//if your certificate signed by yourself,you need use this bypass secure verify
var InsecureTransport http.RoundTripper = &http.Transport{
Dial: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
}).Dial,
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
TLSHandshakeTimeout: 10 * time.Second,
}
h.Transport = InsecureTransport
err := http.ListenAndServeTLS(fmt.Sprintf(":%d",port),crt, key ,h)
if err != nil {
log.Println("Error:",err)
}
}
func ReverseHttpProxy(port int,dst string) {
u, e := url.Parse(dst)
if e != nil {
log.Fatal("Bad http destination.")
}
h := httputil.NewSingleHostReverseProxy(u)
err := http.ListenAndServe(fmt.Sprintf(":%d",port),h)
if err != nil {
log.Println("Error:",err)
}
}


gist:https://gist.github.com/matishsiao/8270e18923d8f78f56c2

沒有留言:

張貼留言