ginをginで動かしている時にginでライブリロードさせながらginをHTTPSで動かす
TL;DR
ssl証明書を作って、gin
(ライブリロードの方)のオプションを以下の様にすれば大丈夫です。
gin -p ${GIN_PORT} --certFile /tmp/keys/server.crt --keyFile /tmp/keys/server.key
gin
(サーバの方)の設定は何も変える必要はありません。理由が気になる方は以下の記事を最後までご覧ください。
起こっていたこと
フロントから叩くAPIをhttpsで叩いてテストしたかったので、ginをhttpsで動かそうとしました。
ginのexamples
を見ながら以下の様に変更しました。
func main() {
r := gin.Default()
// r.Run(":3001")
// ↓
r.RunTLS(":3001", "/tmp/keys/server.crt", "/tmp/keys/server.key")
}
サーバーのポートの設定理由についてはginでginをライブリロードさせる時につまづいたことを参照してください。
よっしゃこれで起動したろ!と思ったらchromeからアクセスできず、サーバーのデバッグログにも何も流れてきていない。
次にライブリロードの方のgin
のgithubを見に行きました。すると
Options
--certFile value TLS Certificate
--keyFile value TLS Certificate Key
お?どうやら良さげなオプションがあります。私としてはこの段階で鍵だけ入れたらsslは勝手に有効になるの?とか思ってましたが。
ということで、ginの起動コマンドを変えてみましょう。
//gin(WAFの方)は先ほど変更したそのまま
$ gin -p 9091 --certFile /tmp/keys/server.crt --keyFile /tmp/keys/server.key
これでいけるのでは?と思いきやまたもやアクセスできず。。。何がダメなんや。。。
そこで私はまず先ほどの疑問である
私としてはこの段階で鍵だけ入れたらsslは勝手に有効になるの?とか思ってましたが。
を解決させるべく、githubにあがっているコードをみにいくことにしました。
本当にgo言語をお勧めしたい理由が、ライブラリのおかげでコードを簡潔に書けるのに、
ライブラリのコードすら簡潔に書かれているところ。gin
のgithubをみにいくとすぐに理由が見つかりました。
gin
(ライブリロードの方)のgithubをみていくと、以下の様なコードが書かれていました。
proxy := gin.NewProxy(builder, runner)
config := &gin.Config{
Laddr: laddr,
Port: port,
ProxyTo: "http://localhost:" + appPort,
KeyFile: keyFile,
CertFile: certFile,
}
err = proxy.Run(config)
ほーーーん、、、(考える人のポーズ)
これを見てまず、ProxyTo
が"http://localhost:"
で決め打ちになっているところに疑問でした。sslの鍵ファイルは使うくせに、内部プロキシはhttpで通して良いのか?
そんなことを少し考えていて、githubのissueを見ても特にそこの部分に突っ込んでる人もいないし、、と5分くらいしたところではっと逆の発想を思いつきました。していないんじゃなくてしなくてもよいのではないか。 と。
する必要ないんじゃね?と思って図に書きました。
以下の図を見てみると、内部ではプロキシーでやりとりしているので、gin
(ライブリロードの方)がsslを担保していれば、gin
(WAFの方)は別にhttpsにする必要はないな。と思えるかと思います。
ということで、gin
(wafの方)を元に戻してみましょう。
うまくいった!鍵ついた!!ライブリロードも動いてる!!!!
これにて終了です。お疲れ様でした。
Discussion