LoginSignup
0
3

More than 5 years have passed since last update.

Let's encrypt How To 2 (運用編)

Last updated at Posted at 2017-05-25

前回初期設定を行ったが、このままだと面倒なことが多いので改善していく。

問題点

  • 証明書の更新を手動でしないといけない
  • 更新時に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を設定しておくと良い。

/etc/nginx/sites-available/default
    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をコメントアウトしたら直った。

/etc/letsencrypt/renewal/www.example.com.conf
# 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で自動に更新するようにしておく。

cert-renew.sh
#!/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時に更新するようにした。

その他

他にすべきこととして、以下が考えられる。(暇な時にでも書く、かも)

  • ハードニング
  • バックアップ
0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3