このブログはAsustor NAS (ADM-4.1.0)からホスティングしていて数年前からLetsEncryptを利用しているが自動更新ができない状況が続いている。
以前は再起動することで更新できたりするときもあったが【証明書を更新する】ボタンをクリックしてもエラーコード(ref.5401)が表示されるだけだし何度かそれを繰り返すと上限回数に達したというエラーメッセージに切り替わるだけだ。
自動更新できるようにしたいところであるがAsustorのサポートを調べてみてもLetsEncryptのほうがおかしいと指摘するような回答だけでなんの解決にもならない。
調べてみるとLetsEncryptにはアクセスしていないのにカウントだけしているみたいだ。これが仕様なのかどうかはわからないがカウントしているということはどこかにそれを記録しているはずとさらに調べてみたら...みっけ!
[/usr/builtin/etc/certificate/certificate.json]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "cert_list":[ { ... }, { ... "issuer_name":"R3", "type":3, "valid_time":1678023427, "valid_time_week":1670338800, "valid_time_daily":1670283431, "update_time":1, "update":true } ] } |
証明書の登録情報は次のようになっているようだ。
1 2 3 4 5 |
valid_time ... 有効期限 valid_time_week ... 更新日? valid_time_daily ... 登録日 update_time ... 証明書更新回数 (1 - 5) update ... 自動更新 |
【証明書を更新する】ボタンをクリックするたびにupdate_timeがインクリメントされ5になると上限回数に達したというメッセージが表示されるので試しにと1に書き換えてみたら...Ref.5401というメッセージに戻ったが更新はされない。orz
以前の設定では更新日が有効期限の21日前に設定されていたようだが最新のADMでは登録日と同じになっていた(バグ?)ので更新日を正しく書き換えれば自動更新してくれるのかなと淡い期待をしてみたもののやはり更新はされなかった。orz
しかし証明書を削除し作成し直すと正常に取得できてしまう。ということはLetsEncryptのアクセス制限には引っかかっておらずLetsEncryptには何もアクセスしていないということになる。ということで結局解決できず。
Asustorのバカヤロー!!
と叫んでも意味ないか...(-_-;)
再度調べてみると証明書にはCertBotを使っていてcrontabで毎日0時にAsustorの更新処理プログラムで確認するようになっているようだがなぜかCertBotを実行してくれない。
CertBotにより証明書の更新が出来て更新された証明書をWebサーバーの証明書ファイルにコピーしてWebサーバーを再起動すればOKということまではわかったので更新スクリプトを書いてみた。以下の方法はsshでrootログインし作業する。ちなみにCertBotについてはよく知らないので間違った使い方をしているかもしれない...
証明書を何日前に更新するかはCertBotの下記ファイルの30の部分を修正する。先頭の’#’は削除すること。ちなみに証明書の再作成等により再度コメント化されてしまうためcrontabで起動時に削除するようにしている。
※${DOMAIN}は証明書発行先ドメイン名に置き換える。
※AppCentralでJQコマンドのインストールが必要。
[修正: vi /usr/local/AppCentral/letsencrypt/.CertBot/config/renewal/${DOMAIN}.conf]
1 |
renew_before_expiry = 30 days |
[証明書ファイル]
1 2 3 |
/usr/builtin/etc/certificate/ssl.crt --> Web Server (apache) /usr/builtin/etc/certificate/ssl.key --> Web Server (apache) /usr/builtin/etc/certificate/ssl.pem --> ADM-UI Server (lighttpd) |
[証明書ファイル生成先]
1 2 |
/usr/local/AppCentral/letsencrypt/.CertBot/config/live/${DOMAIN}/cert.pem --> ssl.crt /usr/local/AppCentral/letsencrypt/.CertBot/config/live/${DOMAIN}/privkey.pem --> ssl.key |
[作成: vi /usr/local/AppCentral/letsencrypt/script/cert_renew.sh]
1 2 3 4 5 |
#!/bin/sh CRT=/usr/local/AppCentral/letsencrypt/.CertBot certbot renew --webroot --agree-tos --noninteractive --preferred-chain 'ISRG Root X1' --max-log-backups 10 -w /volume1/Web --work-dir ${CRT} --logs-dir ${CRT}/log --config-dir ${CRT}/config |
[作成: vi /usr/local/AppCentral/letsencrypt/script/cert_show.sh]
1 2 3 4 5 |
#!/bin/sh CRT=/usr/local/AppCentral/letsencrypt/.CertBot certbot certificates --webroot --agree-tos --noninteractive --preferred-chain 'ISRG Root X1' --max-log-backups 10 -w /volume1/Web --work-dir ${CRT} --logs-dir ${CRT}/log --config-dir ${CRT}/config |
[作成: vi /usr/local/AppCentral/letsencrypt/.CertBot/config/renewal-hooks/deploy/cert_update.sh]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/bin/sh DOMAIN=${DOMAIN} DST=/usr/builtin/etc/certificate CRT=/usr/local/AppCentral/letsencrypt/.CertBot SRC=$CRT/config/live/$DOMAIN LOG=$CRT/log/letsencrypt.log CFG=$DST/certificate.json cp ${SRC}/cert.pem ${DST}/ssl.crt cp ${SRC}/privkey.pem ${DST}/ssl.key /usr/local/AppCentral/httpd-2.4.43/data/binary/sbin/apache2 -k restart EXP=`/usr/local/AppCentral/letsencrypt/script/cert_show.sh | sed -n -r "s/^\s*Expiry Date: (.*)\+.*$/\1/p"` if [ "$EXP" != "" ]; then EXP=`date +%s -u -d "$EXP"` UPD=`date +%s -r "$LOG"` cp $CFG ${CFG}.backup cat ${CFG}.backup | jq "{\"cert_list\":[.cert_list[] | (select(.domain_name == \"$DOMAIN\") | .valid_time |= $EXP | .valid_time_week |= $UPD | .valid_time_daily |= $UPD) // .]}" > $CFG fi |
[追加: crontab -e]
1 2 3 |
@reboot sed -i 's/# renew_before_expiry/renew_before_expiry/g' /usr/local/AppCentral/letsencrypt/.CertBot/config/renewal/${DOMAIN}.conf 0 1 * * * /usr/local/AppCentral/letsencrypt/script/cert_renew.sh 0 5 * * 0 /sbin/reboot |
もし、何か問題等が発生した場合は、crontabに追加した処理をコメント化(#)し証明書を再作成すればもとに戻せる。
PS.
しかし、こんな苦労するくらいならRaspberry PiなどでRaid組んだほうが何かあったときの対処もしやすいしコスパもいいしバカ高くて何かあったときの対処に困ってしまうAsustorとかQNAPとかSynologyとかを使うメリットってなんなんだろうって気がしてきた...生涯勉強!この一言に尽きそうだ。
2022-12-13
/usr/builtin/etc/certificate/ssl.pemがapacheでは未使用だったため証明書生成で作成されたファイルのうち用途不明だったfullchain.pemをコピーしたらAsustorのUIが表示できなくなってアセッてしまった。調べてみるとUIをホスティングしているlighttpdの証明書ファイルとして指定されていてfullchain.pemをコピーしてしまうとlighttpd起動時にエラーになるためコピーしないようにしてみた。まだ何かあるかな?(-_-;)
2023-02-07
予定通り証明書が自動更新された。(^o^) あとは今後のADMメジャーアップデートに注意するだけかな。
2023-04-08
予定通り証明書が自動更新された。問題なしでOKそうだ。
2023-06-10
ADMを何度かアップデートしているうちにまた更新されなくなっていた。再起動したら更新できるようにはなったが原因は不明。それと、cert_update.shが誤動作するので修正。今までうまく動作していたのが不思議だ...(-_-;)
2023-08-11
予定通り証明書が自動更新された。
2023-08-26
“Let’s Encrypt ACME Client”を更新したら追加した更新用のスクリプト・ファイル(*.sh)が奇麗さっぱり無くなってしまった。(T_T)
とりあえずバックアップから復旧しといたが/usr/local/AppCentral/letsencryptに入れとくのがそもそもまずかったのかも...
2023-10-09
予定通り更新されたが更新用スクリプトにミスを発見。
もしかしてASUSTORの更新機能が正常に動作したのかな?まぁ、どちらかで更新されればいいので問題なしとしておこう。(-_-;)
ついでにスクリプトが勝手に削除されないようサブディレクリに移動。