DELAEMON BLOG

Live as if you were to die tomorrow. Learn as if you were to live forever.

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.

Go

当初サーバーにインストールされてたGoはdnf installしたgo1.5.3 linux/amd64だったが、
これではhttps通信になっても、http/2にはならなかった。1.6.2をダウンロードして配置したら、http/2になった