どうも、証明書にまだ取り込まれてない方の私です。
以前から、Ubuntuのパッケージ版certbotを使っていましたが、結構古い版を掴まされてたので、OSのアップグレードを機にパッケージ版certbotを使うのを止めて、茨の道へ進むことにしました。
ここで言う「パッケージ版certbot」とは、apt(あるいはdeb)やsnapでインストールできるcertbotの事を指します。
少なくとも後者なら古い版を掴まされる事は無く、システムリソースに十分な余力があるのとsnap依存に抵抗がなければそちらを使ってみるのも良いかもしれません。
利点:
- バージョンアップにすぐ対応できる
- パッケージ版の場合はすぐに更新できない、或いは永遠に更新が無かったりする
欠点:
- 初回だけ面倒くさい作業するから忍耐力が要る
- インストール作業以外はパッケージ版
certbotと操作に違いは無い
- インストール作業以外はパッケージ版
筆者の当時の環境:
- Google Cloud VM
- Ubuntu 20.04(focal) → 24.04(noble) に、ほかほかアップデートしたての頃
- Python 3.12(デフォルト)
この記事は証明書の作成に関するHow toモノではありません!
1. Pythonをインストールする
と、言ってもPythonはデフォルトでインストール済みなケースが多いので、必要なのはvenvぐらい。コレが無いと仮想環境を作る際、正常動作しないので、しっかりインストールしておく。
インストールするならパフォーマンスの観点から、Python 3.11以上がおすすめだが、Pythonに詳しい・詳しくないにかかわらず、この点はあまり気にする必要が無い。
以前にcertbotをインストールしている場合は、このタイミングで消しましょう。
もし既にアンインストールしているなら次のコマンドは飛ばして下さい。
sudo apt remove certbot
# 恐らく`python3-certbot`は関連パッケージまで消してしまうので使わない方が良いかも。
# パージすると再設定しないければならない余分な仕事が増えるぞ。
# aptではなく、snapでインストールした記憶があるなら、まずは`snap list --all`でインストールされているか確認しよう。
venvをインストールします。
sudo apt update && sudo apt install python3-venv libaugeas0
2. venvを使用してcertbot専用の仮想環境を作る
パッケージ版certbotライブラリと、pip版certbotライブラリが競合することを防げるので、仮想環境作りはとても大事。基本的に/optへ仮想環境を作成するのが無難。
# certbotは、rootレベルで動作させるので、sudoを付けるのを忘れずに。
sudo python3 -m venv /opt/certbot/
エラーメッセージ以外、成功しても何も表示しない。
3. certbot専用の仮想環境にcertbotをインストールする
初回はpipが古かったりするので、インストールに支障が出ないよう、最新版にする。
sudo /opt/certbot/bin/python3 -m pip install --upgrade pip
certbotをインストールする。
sudo /opt/certbot/bin/python3 -m pip install certbot
(余談)偶に面倒見てあげて
certbotは一応毎年何かしらの更新があるので、気づいたら更新してあげよう。
sudo /opt/certbot/bin/python3 -m pip install --upgrade certbot
rootユーザーのcronか何かで定期的なアップグレードを噛ますのも良いかもしれませんが、自動更新ほど愚かな行為は無いよ。
自動更新するにしても、しっかりログを確認するように。
4. certbotのシンボリックリンクを張る
ターミナルに/opt/certbot/bin/certbotと長いコマンドをいちいち打たなくても良いようにする。
一応パッケージ版が/usr/bin/certbotを使っているはずなので、競合回避と決別という意味を込めて/usr/local/bin/certbotにリンクを張る。私情なので好きな方で。
sudo ln -s /opt/certbot/bin/certbot /usr/local/bin/certbot
リンクが張れたならcertbotが最新版であるか確認してみる。
certbot --version
余談だが、元々パッケージ版を使ってた影響なのか、うちではPython 3.8時代のcertbotが/usr/local/bin/certbotに潜んでいたため、リンクを張る際にエラーが発生した。同事情の方はリンクを張る前にls -la /usr/local/bin/して確認したほうが良いかも。
(おまけ)Systemd timerを使って証明書を定期更新する
cronではなく、Systemd timerを使った証明書の定期更新についてメモしていく。
もちろんcronを使っても良い。
ここまで来たならパッケージ版と同調したいのと、クールにタイマー管理をキメたいのでSystemdを駆使してみる。
利点:
- SystemdはUbuntuやRed Hatのシステムに組み込まれていている
- セキュリティ特性が高い
- いつ
certbotが実行して、次回どの時間に動作するか、タイマー管理が繊細 - 雑なログ管理になりにくい
欠点:
- パッケージ版
certbotなら、これらのサービス登録は自動化されている - cronなら一行の記載で済むのに対して、Systemdは色々しなきゃ成らない
certbot.serviceとcertbot.timerのファイルを作る
Systemd timerの場合は、サービスの他にタイマーの設定ファイルを作る必要がある。
いちいち解説しながら書くのは面倒なので、簡単なテンプレートを用意した。上記の通り変えずに環境作成してるならそのまま使えるはず。
-
certbot.serviceとcertbot.timerの名前を統一する - これらのファイルは
/etc/systemd/systemに格納する- 収納しただけではアクティブにはならない
- パッケージが
/usr/lib/systemd/systemを使ってくるので、ここへの収納は避けたい
- パーミッション
644、オーナー:グループをroot:rootに統一する
[Unit]
Description=Certbot
# このUnitはネットワークがオンラインになるまで待つ
After=network-online.target
[Service]
# ExecStartの内容を一度だけ実行(oneshot)する
Type=oneshot
# コマンド内容
ExecStart=/usr/local/bin/certbot --quiet renew --no-random-sleep-on-renew
# certbot専用のプライベート`/tmp`を作って貰う
PrivateTmp=true
[Install]
# ランレベル3相当で有効化させる
WantedBy=multi-user.target
certbotに使われているオプションの意味は次の通り:
-
--quiet- エラー以外は何も表示しない(cronやsystemdに最適) -
--no-random-sleep-on-renew- ランダムスリープを無効にする(RandomizedDelaySecが代わりに仕事する) → 参考
[Unit]
Description=Certbot Schedule
[Timer]
# タイマー
OnCalendar=*-*-01/2 09:00:00
# 0から指定された時間値までの間、タイマーの実行をランダムに遅らせる
RandomizedDelaySec=3600
# 指定の時間に実行できなかった場合、アクティブ成った際に即実行する
Persistent=true
[Install]
WantedBy=timers.target
OnCalendarについては #参考文献 にある記事が詳しいのでそちらを参照して下さい。ここでは簡単にしか書きません。
書式は年-月-日 時:分:秒で、年以外2桁のゼロ埋めします。
テンプレートに書いた内容では
- 2日おき(
*-*-01/2) - 9時(
09:00:00)から10時(RandomizedDelaySec=3600)の間
この内容で実行してくる。もちろん好きに変えて良い。
キチンとできたら次のコマンドを使って有効化していく。
# サービスとタイマーを有効化する
sudo systemctl enable certbot
sudo systemctl enable certbot.timer
# タイマーをスタートさせる
sudo systemctl start certbot.timer
コマンドsystemctl status certbotで、次のようにcertbot.timerのトリガーがアクティブ状態になっていれば良い。
コマンドsystemctl list-timersあるいはcertbot.timerのステータスでも今回と次回の実行スケジュールが確認できる。
もし設定が反映されて無い場合はsudo systemctl daemon-reloadでリロードをかけてみる。
怪しいと思ったらログも確認するように。保存場所は/var/log/letsencrypt/*にある。
面倒と言いつつも、それなりにまとめたので「いいね」して貰えるとうれしみです。あとSystemdのシンタックスハイライトまで用意されてるQiita強い…。
参考文献
- インストール方法など - https://certbot.eff.org/instructions?ws=other&os=pip
- OnCalendar について詳しい記事 - https://takuya-1st.hatenablog.jp/entry/2020/04/24/032822

