はじめに
CentOS5 などのレガシーシステムでは TLS1.2 が利用できません。
OSバージョンアップや別サーバで Reverse Proxy を構築するのが一般的ですが結構な手間です。
そこで今回は、golang でちょちょいと TLS1.2 対応の Reverse Proxy を実装します。
やってみよう
必用なもの
- golang v1.9以前(※ レガシーシステムではv1.9以前でコンパイルしないと動きません)
やりかた
golang ならわずか10行くらいのロジックでリバースプロキシができちゃいます。
main.go
package main
import (
"log"
"net/http"
"net/http/httputil"
"net/url"
)
func main() {
// プロキシしたいレガシーサーバのURL
target, _ := url.Parse("http://localhost:80")
// シングルホストの場合はこれだけでOK
proxy := httputil.NewSingleHostReverseProxy(target)
// ハンドラ内でヘッダーを設定してプロキシする
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
r.Header.Set(`X-Forwarded-Host`, r.Header.Get(`Host`))
r.Header.Set(`X-Forwarded-Proto`, r.URL.Scheme)
proxy.ServeHTTP(w, r)
})
// TLS1.2でListen
err = http.ListenAndServeTLS(":443", "path to ssl cert", "path to ssl key", nil)
if err != nil {
log.Fatal(err)
}
}
また、http.HandlerFunc()内では、以下のように Request Header も設定できます。
レガシーサーバ側が X-Forwarded-Proto などに対応していない場合は、Request をゴニョゴニョやって対応しましょう!
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
r.Header.Set(`X-Forwarded-Host`, r.Header.Get(`Host`))
r.Header.Set(`X-Forwarded-Proto`, r.URL.Scheme)
r.URL.Host = target.Host
r.URL.Scheme = target.Scheme
proxy.ServeHTTP(w, r)
})