http/2@Hugo & Let's Encrypt
Let's Encryptで発行した証明書を使って、GolangのHugoで動いてるWebサイトをhttp/2にする
環境
OS: Fedora22
Go: 1.6.2
準備
firewalldのhttps/443番ポートを有効にしておく
$ sudo firewall-cmd --list-all $ sudo firewall-cmd --permanent --add-service=https $ sudo firewall-cmd --permanent --add-port=443/tcp $ sudo systemctl restart firewalld $ sudo firewall-cmd --list-all
80番 ポートで動いてるサービスは止めておく
Certbotクライアントが疎通確認をする場合に既に80番ポートが使われていると、メッセージが表示されて、先に進めない
SSL/TLS証明書発行
ここ読めば簡単
Let's Encrypt の使い方 - Let's Encrypt 総合ポータル
Let's Encryptで証明書を発行するツールのcertbotをダウンロード
$ git clone https://github.com/certbot/certbot
Let's Encryptで証明証を発行する
./certbot-auto certonly --standalone -d <domain>
Certbotクライアントの問いに答えてく。連絡先のメアドとか、同意しますかとか
生成されたファイルの保存場所と期限。期限は3ヶ月と短い
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/<domain>/fullchain.pem. Your cert will expire on <有効期限>.
でも更新はこれだけで良いので簡単。毎日更新すると怒られる
$ ./certbot-auto renew
Hugo
自分のレポジトリにcloneしてコード変更
commands/server.go
- err = http.ListenAndServe(endpoint, nil) + err = http.ListenAndServeTLS(endpoint, "/etc/letsencrypt/live/<domain>/fullchain.pem", "/etc/letsencrypt/live/<domain>/privkey.pem
main.go
- "github.com/spf13/hugo/commands" + "github.com/delaemon/hugo-https/commands"
go build して $GOPATH/bin/ に hugo-httpsとして置いておく
Systemd
新しいサービスとして設定ファイルを追加
web socket使ってるところをwssにするのは面倒だったのでExecStart の hugo-https serverコマンドに
-
- disableLiveReloadを付けた
付けえない場合は以下のエラーがブラウザで吐かれていた
livereload.js:1 Mixed Content: The page at 'https://<domain>' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://<domain>:443/livereload'. This request has been blocked; this endpoint must be available over WSS.n.Connector.e.connect @ livereload.js:1 livereload.js:1 Uncaught SecurityError: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.