Let's Encryptの証明書は有効期限が3か月で切れちゃうので、折を見て更新しなければなりません。
都度、ちゃんと思い出して更新作業をすればいいのですが、人は忘れてしまうものです。僕は忘れます。
というわけで、ほっといても月一くらいで勝手に更新していてほしいです。ついでに更新したら更新したよって通知だけでもSlackに送ってほしいです。
Slackへの送信部分は、Slackboard (https://github.com/cubicdaiya/slackboard)を使用させていただきました。
Slackboardについては以下の記事を参照。
ちなみに環境は以下の通りです。
- CentOS 7.2
- Slackboard 0.6.2
- golang 1.5.3
- Nginx 1.9.9
SlackへPostするIncoming-WebHookは事前に準備しているものとします。
Slackboardの導入
…その前にGo言語
何はともあれSlackへ通知する用にSlackboardを導入しなければなりません。しかしこれGo言語で作られているので、Slackboardに先立ってまずGo言語を使えるようにする必要があります。
# wget https://storage.googleapis.com/golang/go1.5.3.linux-amd64.tar.gz
# tar -C /usr/local -xzf go1.5.3.linux-amd64.tar.gz
# export PATH=$PATH:/usr/local/go/bin
/usr/local/go
配下に実行ファイルその他が解凍されます。
そしてSlackboard
go get
というコマンドが割と便利で、GitHubからclone
してさらにはビルドまでしてくれます。
# mkdir /usr/local/slackboard
# cd /usr/local/slackboard
# export GOPATH=`pwd`
# go get -u github.com/cubicdaiya/slackboard/...
すると、/usr/local/slackboard/bin
の中にCLIやサーバプログラムが出来上がります。
続いて設定ファイルを作成します。iniに似ていますが、TOMLという形式だそうです。
slack_url
にはSlack側で設定したWebHookのURLを指定します。channel
やusername
は適宜変更してください。
[core]
port = "29800"
slack_url = "https://hooks.slack.com/services/....."
[[tags]]
tag = "letsencrypt"
channel = "#general"
username = "Let's Encrypt"
コマンドラインでサーバを起動することは当然可能ですが、どうせならやっぱりサービス化したいですね。したいです。
[Unit]
Description=Slackboard/Slack Proxy Server
After=network.target
[Service]
ExecStart=/usr/local/slackboard/bin/slackboard -c /usr/local/slackboard/bin/slackboard.toml
[Install]
WantedBy=multi-user.target
ユニットファイルが書けたら、サービスを有効化し、起動します。
# systemctl enable slackboard
# systemctl start slackboard
自動更新させる
Let's Encryptのサイトにはcronで毎月行わせるサンプルが載っていましたので、それに従います。ただし、毎月1日とかみんなやりそうなので、ここは他に譲って20日とかにします。
更新用スクリプト
まずは、更新して結果をSlackboard経由で通知するスクリプトを作成します。ここではwebroot
プラグインを使用します。
#!/bin/bash
SLACKBOARD=/usr/local/slackboard/bin/slackboard-cli
if ! /path/to/letsencrypt-auto certonly --renew-by-default --webroot -w /var/www/html -d example.com ; then
# NG
echo "Let's Encrypt certificates auto renewal failed." | $SLACKBOARD -t letsencrypt -s localhost:29800 -l crit 1>/dev/null 2>/dev/null
exit 1
else
# OK
systemctl reload nginx
echo "Let's Encrypt certificates auto renewal succeeded." | $SLACKBOARD -t letsencrypt -s localhost:29800 -l info 1>/dev/null 2>/dev/null
exit 0
fi
crontabに追加
毎月20日、朝5時に更新用のスクリプトを走らせるようにします。
# crontab -e
0 5 20 * * /path/to/letsencrypt-update.sh
失敗時にだけ通知したり、新しい有効期限を通知内容に含めたり、文言等はいい感じに調整するのもよいでしょう。Let's EncryptのAPIや他のクライアントを使うともっと柔軟な通知や更新ができるかもしれませんね。