前回初期設定を行ったが、このままだと面倒なことが多いので改善していく。
問題点
- 証明書の更新を手動でしないといけない
- 更新時にnginxを止める必要がある
これらを解決していく
webroot化
前回standaloneを使ったが、これは80番ポートにbindするのでnginxが動いてると実行できない。
そこで、実際ホストしてるルートフォルダを使って認証をするようにしてnginxを止めずに認証出来るようにする。
(最初からwebrootを使って認証した場合このプロセスは不要)
$ sudo letsencrypt certonly --webroot -w /var/www/html -d vintersnow.tk --agree-tos --force-renewal -n
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
...
--force-renewal
を使って強制的に更新する。
--dry-run
を使ってnginxが起動したままでも動くのか確かめる。
$ sudo letsencrypt renew --dry-run --agree-tos
Processing /etc/letsencrypt/renewal/www.example.com.conf
** DRY RUN: simulating 'letsencrypt renew' close to cert expiry
** (The test certificates below have not been saved.)
Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/www.example.com/fullchain.pem (success)
** DRY RUN: simulating 'letsencrypt renew' close to cert expiry
** (The test certificates above have not been saved.)
...
webrootを行うにはlocationのフォルダを指定する必要がある(/var/www/html
など)
プロキシなどでルートフォルダがない場合、プロキシする前に以下のようにlocationを設定しておくと良い。
location ^~ /.well-known {
default_type "text/plain";
root /var/www/html;
}
トラブルシューティング
renewal時に接続できない
ubuntu 14.04, certbot-autoのバージョンは0.14.1
certonlyで--force-renewalは出来るのになぜかrenewコマンドは実行できないという問題。
正直原因がわからないが、以下のようにrenewからweb_pathをコメントアウトしたら直った。
# Options used in the renewal process
[renewalparams]
authenticator = webroot
installer = None
account = *******************************
#webroot_path = /var/www/html,
[[webroot_map]]
www.example.com = /var/www/html
自動更新
毎回手動で更新するのは怖いのでcronで自動に更新するようにしておく。
#!/bin/sh
LOGFILE=/var/log/update_sslcert.log
COMMAND=letsencrypt
WEBSERVER_RESTART_COMMAND="service nginx restart"
MAILTO=youmail@gmail.com
echo "===== Update SSL Cert =====" >> ${LOGFILE}
echo "`date` Update SSL Cert start" >> ${LOGFILE}
${COMMAND} renew \
--post-hook "$WEBSERVER_RESTART_COMMAND" \
--agree-tos \
--non-interactive >> ${LOGFILE}
if [ "$?" != 0 ]; then
STATUS='Failed'
else
STATUS='Successed'
fi
echo "Update SSL Cert $STATUS" >> ${LOGFILE}
echo "Update SSL Cert $STATUS [$(date)]" |\
mail -s "Update SSL Cert in `hostname`" ${MAILTO}
echo "`date` Update SSL Cert end" >> ${LOGFILE}
失敗したか、成功したかをメールで送るためにsendmailコマンドが必要。
メールでなくても、slackに通知とかでも良いと思う。
フェイルセーフとして、letsencryptに設定したメールアドレスに期限切れが近いとメールがいくはずである。(試したことないので分からない。)
cronに設定する。
0 3 1 * * /home/ubuntu/script/cert-renew/cert-renew.sh
毎月1日3時に更新するようにした。
その他
他にすべきこととして、以下が考えられる。(暇な時にでも書く、かも)
- ハードニング
- バックアップ