🦁

ginをginで動かしている時にginでライブリロードさせながらginをHTTPSで動かす

2021/02/16に公開

TL;DR

ssl証明書を作って、gin(ライブリロードの方)のオプションを以下の様にすれば大丈夫です。

gin -p ${GIN_PORT} --certFile /tmp/keys/server.crt --keyFile /tmp/keys/server.key 

gin(サーバの方)の設定は何も変える必要はありません。理由が気になる方は以下の記事を最後までご覧ください。

起こっていたこと

フロントから叩くAPIをhttpsで叩いてテストしたかったので、ginをhttpsで動かそうとしました。
ginexamplesを見ながら以下の様に変更しました。

func main() {
	r := gin.Default()
	// r.Run(":3001")
	// ↓
	r.RunTLS(":3001", "/tmp/keys/server.crt", "/tmp/keys/server.key")
}

サーバーのポートの設定理由についてはginでginをライブリロードさせる時につまづいたことを参照してください。
よっしゃこれで起動したろ!と思ったらchromeからアクセスできず、サーバーのデバッグログにも何も流れてきていない。

次にライブリロードの方のgingithubを見に行きました。すると

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の方)を元に戻してみましょう。

うまくいった!鍵ついた!!ライブリロードも動いてる!!!!

これにて終了です。お疲れ様でした。

GitHubで編集を提案

Discussion