golangのWAFであるechoを使ってapiサーバーを書いていましたが
https化が恐ろしく簡単だったのでメモ。
こちらを参考に書きました。
https://echo.labstack.com/cookbook/auto-tls
裏側でLet’s Encrypt. と接続してhttps化を行ってくれます。
ドメインは必要なので、ローカル環境では動きません。
sample
server.go
package main
import (
"golang.org/x/crypto/acme/autocert"
"os"
"github.com/labstack/echo"
"github.com/labstack/echo/middleware"
)
func main() {
e := echo.New()
env := os.Getenv("ENV")
if env == "prod" {
e.AutoTLSManager.HostPolicy = autocert.HostWhitelist(os.Getenv("HOST"))
e.AutoTLSManager.Cache = autocert.DirCache("/var/www/certs")
e.Pre(middleware.HTTPSWWWRedirect())
}
//
// <snip>
//
switch env {
case "prod":
e.Logger.Fatal(e.StartAutoTLS(":443"))
case "dev":
defaultAddr := ":80"
e.Logger.Fatal(e.Start(defaultAddr))
default:
defaultAddr := ":9000"
e.Logger.Fatal(e.Start(defaultAddr))
}
}
e.AutoTLSManager.HostPolicy = autocert.HostWhitelist(os.Getenv("HOST"))
e.AutoTLSManager.Cache = autocert.DirCache("/var/www/certs")
e.Pre(middleware.HTTPSWWWRedirect())
// <snip>
e.Logger.Fatal(e.StartAutoTLS(":443"))
hostとキャッシュとリダイレクトの設定を行う。
そのあと443番でStartAutoTLS()を呼ぶ
僕は、dockerで管理しているのでdocker-compose.yml
をこんな感じにして
環境変数をセットしています。
docker-compose.yml
version: '2.1'
services:
go-19:
build: <your-project>
env_file:
- ./.env
volumes:
- ./<your-project>:/go/src/<your-project>
- ./<your-project>/certs:/var/www/certs
command: ./<app-bin>
ports:
- "${HTTPS}:${HTTPS}"
- "80:80"
tty: true
.env
# Host's portforward settings
HTTPS=443
HOST=localhost
ENV=dev
注意すること
キャッシュの宣言をしないとビルドの度に
Let’s Encryptにリクエストを投げてしまうので
取得制限にひっかかります。(2017/11月現在、一週間に5回まで)
自分のドメインが何回リクエスト投げているか見るにはこちらで
https://crt.sh/
sample