ホームお問い合わせプロフィール未経験→就職転職合格率年収の相場ブラック企業判別定時帰りする方法

Let’s EncryptのAndroid7.1問題を1年先送りにする方法【具体的手順を紹介】

2020年9月8日に投稿 → に更新 技術

Android7.1以前でLet’s Encrypt証明書のサイトが見られなくなる問題を一年先延ばしにする具体的な対応方法を書きます。

一言でいうと、

「certbotを最新版にして、コマンドラインに–preferred-chain “DST Root CA X3″を追加する」

ということです。

これを2020年9月30日までにやっておけば、ルート証明書の切り替えを一年延期できるので、2021年9月30日まで古いAndroid端末でもサイトが見られる状態になります。

手順は大まかに分けて以下の3つです。

  1. certbotのバージョンを1.6.0以上に更新する
  2. certbot-autoのrenewコマンドに–preferred-chain “DST Root CA X3″を追加して実行する
  3. certbotを定期実行しているcronのコマンドを変更

これだけです。1に少し手こずりましが、一度やり方が分かっちゃえば簡単です。

では、そんな試行錯誤を経て見つけた手順を紹介していきます。

1. certbotのバージョンを1.6.0以上に更新する

1.6.0からcertbotに–preferred-chainを指定するオプションが追加されたので、certbotをバージョンアップします。
私の場合、VPSを2台借りていて、OSがそれぞれ、

  • Ubuntu
  • CentOS

なのですが、どちらも同じ手順で出来ました。

元々インストールしてあるCertbotをバージョンアップするのではなく、最新バージョンをgit cloneでダウンロードして使う方法です。

cd /work
git clone https://github.com/certbot/certbot.git
cd certbot/
./certbot-auto --version

以上を実行すると

certbot 1.7.0

とコンソールに出力されました(2020/09/06に実施)。

2. certbot-autoのrenewコマンドに–preferred-chain “DST Root CA X3″を追加して実行する

私の場合、/work/certbotに新たにインストールしたので、

/work/certbot/certbot-auto renew --force-renewal --preferred-chain "DST Root CA X3"

を実行してルート証明書をDST Root CA X3のまま更新しました。
–force-renewalオプションを付けることで、証明書の期限が残っていても強制的に証明書が更新されます。

/etc/letsencrypt/renewal/yourdomain.com.confを見てみると

preferred_chain = DST Root CA X3

という一行が追加されています。これで次回renewを実施する際にもpreferred_chainにDST Root CA X3が付加されて実行される模様ですが、念の為、cronで定期実行しているrenewコマンドにも–preferred-chain “DST Root CA X3″を追加しておきます。

3. 定期実行しているcronのコマンドを変更

3.1 以前使っていたcertbotの自動実行設定を削除する

以前のCertbotをcertbot.eff.orgの手順でインストールしていた場合、Certbotの自動実行の設定も自動でされています。

The command to renew certbot is installed in one of the following locations:

/etc/crontab/
/etc/cron.*/*
systemctl list-timers

↑certbot.eff.orgによると、「crontabかcronかsystemctlのどれか1つに設定されます。」ってことですが、私の場合、

  1. cron
  2. systemctl list-timers

の2つに設定されていました。「一つじゃないのかよ?」と言いたいところですが、仕方ないので、これらを削除します。

まずはcronから行きましょう。/etc/cron.d/certbotに書かれていたので、このファイルを削除するか、適当なディレクトリに移動します。そしてcronを再起動します。

mv /etc/cron.d/certbot /work
service cron restart

続いてsystemctlの設定を削除します。

systemctl stop certbot.timer #タイマーを停止
systemctl disable certbot.timer #タイマーを無効化
→ Removed symlink /etc/systemd/system/timers.target.wants/certbot.timer.

systemctl daemon-reload #設定をリロードする

cd /lib/systemd/system
mv certbot.service /work/certbot.service #ファイルを移動(削除でも良いはず)
mv certbot.timer /work/certbot.timer  #ファイルを移動(削除でも良いはず)

3.2 新バージョンのcertbotコマンドをcrontabに登録する

crontab -e
0 4 * * * /work/certbot/certbot-auto renew --preferred-chain "DST Root CA X3" --renew-hook "/etc/init.d/nginx restart" 1> /work/log/renew_ssl_out.txt 2> /work/log/renew_ssl_err.txt

先程述べたとおり、–preferred-chain “DST Root CA X3″はconfに保存されているので、つけなくてもいいかもしれませんが、念の為つけておきました。

毎日午前4時にrenewコマンドを実施して、証明書の更新が行われた場合は–renew-hookで指定したnginxの再起動が行われます。毎日じゃなくて週イチとかでも良さそうですけどね。

「設定ファイルが古い」ってログが出る場合の対処

元々のCertbotをaptでインストールしたほうのサーバ(Ubuntu)の/var/log/letsencrypt/letsencrypt.logファイルに以下のようなログがありました。

2020-09-11 03:57:09,370:INFO:certbot.storage:Attempting to parse the version 1.7.0 renewal configuration file found at /etc/letsencrypt/renewal/yourdomain.com.conf with version 0.31.0 of Certbot. This might not work.

「certbotが1.7.0なのに設定ファイルが0.31.0用になっとるぞ」っていう警告です。このままでも動くっぽいですが、もう一つのサーバ(CentOS)にはこのようなログがなく、設定ファイルを見てみると、少し設定項目が異なっていたので、合わせてみたところ、このログは出力されなくなりました。

変更前の /etc/letsencrypt/renewal/yourdomain.com.conf


[renewalparams]
installer = nginx
server = https://acme-v02.api.letsencrypt.org/directory
authenticator = nginx
account = xxxxxxxxxxxxxx
preferred_chain = DST Root CA X3

変更後


[renewalparams]
authenticator = webroot
account = xxxxxxxxxxxxxx
renew_hook = /etc/init.d/nginx restart
server = https://acme-v02.api.letsencrypt.org/directory
preferred_chain = DST Root CA X3
[[webroot_map]]
yourdomain.com = /app/yourdomain/public

以上で完了です!これでひとまずAndroid7.1以下切り捨てを2021年9月30日まで延期できました。

やらなきゃと思いつつも、なかなか着手できなくて、実際やったら、そこそこめんどかったですが、やり終わった後は、気分がスッキリして爽快な疲労感を感じました!