Letsencrypt

Let's Encrypt更新

先週日曜、Webサーバーから

E: Package 'python-virtualenv' has no installation candidate

というエラーメール着弾。どうやらUbuntu 20.04 (Focal Fossa)にアップデートした余波でLet’s Encryptの自動更新がエラーになったようだ。

Let's Encrypt

Let’s Encrypt

Ubuntu 20.04 上の certbot-auto でエラーが出る場合に倣ってpythonをpython3に書き換えてみたがダメ。手動でpython3-virtualenvをinstallしてみたものの、結局python2.7を見に行ってpipが古いと怒られる始末。

そもそも古いのは5年前に導入した自動更新スクリプトなんじゃね?と思い、git pullしなおしてみたものの、今度は

Skipping bootstrap because certbot-auto is deprecated on this system.
/opt/letsencrypt/letsencrypt-auto has insecure permissions!
To learn how to fix them, visit https://community.letsencrypt.org/t/certbot-auto-deployment-best-practices/91979/
**Your system is not supported** by certbot-auto anymore.
Certbot cannot be installed.
Please visit https://certbot.eff.org/ to check for other alternatives.

という結果に。

最新LTSのUbuntu 20がnot supportedてどういう事!?と思ったのだが、2021年版Let’s EncryptでのSSL証明書の発行方法/SSL化の方法によると

これまでcertbot-autoで証明書の発行ができたと思いますが、2020年12月のリリース1.10.0からDebian系で非対応になり、2021年1月のリリース1.11.0では全てのOSで非対応となりました。

という事で驚いたのだが、Certbot-auto no longer works on Debian based systemsによると

NSD4

9月になったので久々にLet’s Encryptによるサーバ証明書の自動更新具合をチェックしたところ、www.~の証明書なのにCNがmail.~になっている事に気づいた。

正確に言うと"今まで"気づいてなかった問題に"今になって"気づいたというのが正しく、最近おかしくなったわけではないと思うのだが、取り敢えず気づいたからには修正する方向でLet’s Encrypt の使い方を再確認。すると、「letsencrypt-auto/certbot-auto」においてドメイン名とサブドメイン名の両方を指定する必要があるような印象だったので、

sudo letsencrypt-auto certonly --webroot --webroot-path=/var/www/html \
        -d bravotouring.com -d www.bravotouring.com

としたものの、今度は**“bravotouring.comのアドレスが引けない”**と叱られた。

そら、bravotouring.comはドメインでホストじゃないから仕方ないじゃん…と思いつつ、ここで意地を張ってもしかたがないので、おとなしくDNSの設定を追加することに。

いつものとおり、/etc/nsd/zones/bravotouring.com.zoneのドメイン名の直下にCNAMEを

~~
       IN   CNAME  vps
vps    IN   A      49.212.151.67
vps    IN   AAAA   2403:3a00:202:1112:49:212:151:67
~~

…と追記して「えいや!」っとしたところ

yano@vps:~$ sudo nsdc rebuild
sudo: nsdc: **command not found**
yano@vps:~$

…な結果で、「nsdcどこ行ったの????」という事にこれまた今頃気づいて大慌て。

色々と調べてみたら今年3月のアップデートでNSD 3からNSD 4に上がった形跡があり、その際にnsdc(8)zonec(8)のコマンドも削除されたようだ。置き換えではなく「廃止」という事は、手順そのものが不要となったと考えるのが自然なのだが、DNSクエリを投げても返答は変わらず、/var/lib/nsd/nsd.dbも今年2月のタイムスタンプのままなので、NSDを再起動してsyslogを見たところ

nsd[6846]: bravotouring.com.zone:17: **CNAME and other data at the same name**
nsd[6846]: zone bravotouring.com file bravotouring.com.zone read with **1 errors**

なエラーが出ていた。

NSD4のプログラム

Unbound/NSD最新情報(OSC 2014 Tokyo/Spring)より

調べてみたところZone apexとCNAMEの制限にひっかかっているらしく、/etc/nsd/zones/bravotouring.com.zone

TTL 3600
@ IN SOA ns1.bravotouring.com. foo.bravotouring.com. (
            201609051429 ; serial
            10800  ; refresh
            3600   ; retry
            86400  ; expire
            43200  ; default_ttl
        )
       IN   NS     ns1.bravotouring.com.
       IN   NS     ns2.bravotouring.com.
       IN   MX 10  mail.bravotouring.com.
       IN   TXT    "v=spf1 mx a:foo.bravotouring.com ~all"
@      IN   A      49.212.151.67
@      IN   AAAA   2403:3a00:202:1112:49:212:151:67
vps    IN   CNAME  @
ns1    IN   CNAME  @
ns2    IN   CNAME  @
mail   IN   CNAME  @
www    IN   CNAME  @

…な感じで書き直して起動OK。 なお、nsdc rebuild/reloadに代わるNSD 4でのzoneファイル更新は

Let's Encrypt自動更新

先月25日に行ったLet’s Encrypt対応。

仕上げに証明書の自動更新手順を試行錯誤していたところ、

The rate limit is 5 certs in 7 days per domain

と怒られた。どうやら1ドメインにつき週に5証明書しか発行できない制限があるらしく、wwwとmailの2サーバを設定した結果、速攻で上限に引っかかったようだ。

…という不手際で間が空いてしまったが、letsencrypt-auto renew一撃で証明書が更新できる事が確認できたので、apacheのrestartまでセットにしたスクリプト /usr/local/bin/letsencrypt-renew を作成。

yano@vps:~$ cat `/usr/local/bin/letsencrypt-renew`
#!/bin/sh
/opt/letsencrypt/letsencrypt-auto renew --force-renew \
    --webroot --webroot-path=/var/www/html --no-self-upgrade;
/usr/sbin/apachectl restart;
yano@vps:~$

最後に毎月末の11時59分に証明書を自動更新するよう/etc/cron.d/letsencrypt を設定。

yano@vps:~$ cat `/etc/cron.d/letsencrypt`
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user  command
59 11 28-31 * * root if [ $(date -d 'tomorrow' +\%d) -eq 1 ]; then `letsencrypt-renew` > /dev/null;fi
yano@vps:~$

なるほど、「明日が1日」という条件は"目から鱗"だったよ。

これでひと安心。

参照

INTERNET Watch http://internet.watch.impress.co.jp/