Skip to main content

Let's Encrypt / Certbot 運用チートシート

Author
blackratel

HTTPS 対応サイトを運用していると、「証明書が増えてきた」「更新テストをしたい」「自動更新の設定が合っているか不安」といった場面が定期的にやってくる。

この記事では、Certbot の日常運用でよく使う操作を一か所にまとめた。セットアップ手順ではなく、運用フェーズで実際に使うコマンドと設定に絞っている。


1. 証明書の確認・削除
#

まず現状把握から。取得済みの証明書は一覧で確認できる。

sudo certbot certificates

有効期限・ドメイン・証明書名が表示されるので、不要なものがあれば削除する。

# 対話形式で選択
sudo certbot delete

# 証明書名を直接指定
sudo certbot delete --cert-name example.com

削除すると /etc/letsencrypt/live/archive/renewal/ 配下のファイルが一括で消え、自動更新の対象からも外れる。


2. dry-run で事前テスト
#

証明書の取得・更新に失敗し続けると Let’s Encrypt のレート制限に引っかかる。本番実行の前に dry-run でテストしておくのが鉄則だ。

dry-run ではステージング環境が使われるため、レート制限の心配なく何度でも試せる。

新規取得のテスト
#

sudo certbot certonly --dry-run --webroot \
  -w /var/www/acme-challenge \
  -d example.com

既存証明書の更新テスト(推奨)
#

既存の .conf 設定(authenticator = webroot など)を読み込んで実行される。

sudo certbot renew --dry-run --cert-name example.com

注意: certbot certonly --dry-run は新規取得扱いのため .conf を参照しない。更新のテストには必ず certbot renew --dry-run を使うこと。


3. Apache ポート 80 の設定(ACME challenge 専用)
#

webroot 認証を使う場合、ポート 80 を Let’s Encrypt の認証専用にして、それ以外のアクセスは HTTPS にリダイレクトする構成が扱いやすい。

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com blog.example.com

    DocumentRoot /var/www/acme-challenge

    <Directory /var/www/acme-challenge>
        Options -Indexes
        AllowOverride None
        Require all granted
    </Directory>

    RewriteEngine On
    # ACME challenge はそのまま通す
    RewriteRule ^/\.well-known/acme-challenge/ - [L]
    # それ以外は HTTPS にリダイレクト
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

    ErrorLog  ${APACHE_LOG_DIR}/acme-challenge-error.log
    CustomLog ${APACHE_LOG_DIR}/acme-challenge-access.log combined
</VirtualHost>

設定のポイント:

  • ServerAlias にサブドメインをまとめて記載する
  • certbot の webroot-pathDocumentRoot を一致させる
  • /.well-known/acme-challenge/ ディレクトリを事前に作成しておく
sudo mkdir -p /var/www/acme-challenge/.well-known/acme-challenge
sudo chown -R www-data:www-data /var/www/acme-challenge

4. 自動更新を crontab に設定
#

まず systemd timer を確認する(Ubuntu/Debian)
#

certbot をパッケージインストールした場合、certbot.timer が既に動いていることが多い。二重実行を避けるため、先に確認する。

systemctl status certbot.timer

timer が有効(active (waiting))であれば、crontab の追加設定は不要だ。

crontab に登録する場合
#

timer が無効だった場合や、明示的に cron で管理したい場合は以下を登録する。

sudo crontab -e
# Let's Encrypt 証明書の自動更新(1日1回)
# 実際に更新されたときだけ Apache をリロード
30 3 * * * certbot renew --quiet --deploy-hook "systemctl reload apache2" >> /var/log/certbot-renew.log 2>&1

--deploy-hook を使うと、証明書が実際に更新されたときだけ Apache がリロードされる。


5. 設定変更後の必須コマンド
#

VirtualHost の設定を変更したら、必ず構文チェックを挟んでからリロードする。

# 構文チェック(エラーがあれば反映前に気づける)
sudo apachectl configtest

# 問題なければ Apache リロード
sudo systemctl reload apache2

configtestSyntax OK が出ることを確認してから reload するクセをつけておくと、ミスによるサービス停止を防げる。


まとめ
#

やりたいこと コマンド
証明書一覧を確認 certbot certificates
証明書を削除 certbot delete --cert-name <name>
更新のテスト certbot renew --dry-run --cert-name <name>
自動更新の確認 systemctl status certbot.timer
Apache 構文チェック apachectl configtest

Certbot は一度設定してしまうと普段あまり触らないが、いざというときにコマンドを探し回るのは避けたい。このチートシートが手元にあれば、運用時の迷いを減らせるはずだ。