Let's encrypt の 更新cronが設定できてなかった #2

結論

$ sudo cron -e
## cronに次の設定
30  1  *  *  *  root   certbot renew --webroot -w /var/www/html/"実際のWebページのDocumentRootに合わせる" 

 

経緯

Let's Encrypt のサーバ証明書は、証明書が切れそうになったらメール通知が届く。

Let's Encrypt のアラートメール

そもそもこのメールが来ないように運用するのが正しい姿だが、
フリー認証局のLet’s Encryptがメールでの有効期限通知の終了を告知 との記事を目にして、
いよいよちゃんとしておかないと忘れそうと思ったのがことの発端。

過去の Let's encrypt の 更新cronが設定できてなかった の記事の通り、
設定自体はやってみていたものの、サイトを動かしたまま certbot を動かすのができておらず、
なんとなしに3ヶ月毎に手動でやっていたのが実情であった。(言ってもサクッとは終わるし...)

詳細

Let's Encrypt と certbot

そもそもサーバ証明書の更新には、サーバ側で証明書作成依頼(csrファイル)を作って、
そのファイルを認証局が確認して、証明書・証明書秘密鍵・中間証明書 を発行してもらい、
その3点セットをサーバ上に配置する必要がある。

認証局の作業はお金がかかるが、Let's Encrypt だと無償である。
その分有効期限が3ヶ月と短い(通常の認証局だと1年モノ)

Let's Encrypt

Let's Encryptは、非営利団体の Internet Security Research Group (ISRG) が提供する自動化されたフリーでオープンな認証局です。

Let's Encrypt では、csrを作って承認してもらって配置してといった、一連の作業が、
certbot というコマンドにまとめれれており、基本はこれを実行するだけで一連の作業が終わる。

certbot と httpd

certbot が動くときに、サーバの 80番port または 443番port を certbot が使いたいらしい。

このポートは http (80) や https(443)で通常は使われているため、
httpd(webサーバ)が動いている間にcertbotを実行するとエラーになる。

この挙動が certbot の standaloneモードでの実行らしい。

過去の記事では、httpd を certbot 実行後にreloadする処理だけであった。
そのため、80番ポート使えないんだけど?というエラーメッセージがでていた。

対処

どうやら2つ方法があるらしい。

方法1)証明書更新の間は httpd を止める

/etc/letsencrypt/renewal/"ドメイン名".conf の中に、certbot の前後にいれる処理を追記できるようだ。
単純に httpd の停止/起動を書けば良いらしい。

# renew_before_expiry = 30 days
version = 2.5.0
archive_dir = /etc/xxxxxx
cert = /etc/xxxxxx
privkey = /etc/xxxxxx
chain = /etc/xxxxxx
fullchain = /etc/xxxxxx

# Options used in the renewal process
[renewalparams]
account = xxxxxxxxxxxx
authenticator = standalone
server = https://acme-v02.api.letsencrypt.org/directory
key_type = xxxxxxxxxxxx
pre_hook = systemctl stop httpd ## 前処理
post_hook = systemctl start httpd ## 後処理

結局この方法は取らなかったので、本当に動くのかは未確認。
httpd 起動にsudoが必要だったりするはず。

CDN入れていればよいかもしれないが、サーバ止めるのはあんまり好きではないなと思い却下。
そもそもCDNちゃんと入れているならば、CDN側(CloudFrontなり)で証明書管理すべき。

 

方法2)webroot モードを使う

多分こちらが正解で、--webroot オプションをコマンドにいれるというもの。

$ sudo certbot renew --webroot -w /var/www/html/"実際のWebページのDocumentRootに合わせる"

結論に書いたものは、これをcronで定期実行しているもの。
certbot 自体は、証明書の更新が不要ならばそのまま処理を終えてくれるので、
毎日深夜にコマンド実行とかでよいはず。

本当にこれが動くのか疑心暗鬼であれば、--dry-run オプションを入れて動作確認だけするとよい。

 

そもそも Amazon Linux では --apache オプションが動かなくて云々と、
動かない理由を言っていたのがだいぶ恥ずかしい。

ただ、cron や certbot 自体は別途 Amazon Linuxでも設定が必要だったはず。(恥の上塗り)
これで3ヶ月後には自動で処理されているはず...