HomeLabのLet's Encrypt証明書を全自動更新するスクリプト
こんにちは!大阪・堺市に拠点を置く、中古PCとOA機器の専門店 ナベキンファクトリー のサポート担当兼、技術ライターです。現場の「困った!」を解決するTIPSをお届けしています。
さて、自宅サーバー(HomeLab)で、複数のサービスを、独自ドメインで運用している皆さん。3ヶ月に一度、Let's Encryptから届く「証明書の有効期限が近づいています」という、あの通知メールに、うんざりしていませんか?サービスごとに、サーバーを止めて、手動で更新コマンドを実行する…そんな“面倒な儀式”は、今日で終わりにしましょう。
この記事を読めば、Certbotという公式ツールを使い、複数のドメインや、ワイルドカード証明書(*.your-domain.com)さえも、一括で、完全に自動更新するための、具体的なスクリプトと、その設定手順が、手に取るように分かります。
原因と概要
Let's Encryptの証明書の有効期間が「90日」と短いのは、決して“意地悪”ではありません。それは、「証明書の更新プロセスは、そもそも人間が手でやるものではなく、プログラムが自動でやるべき」という、設計思想の表れです。手動更新に頼ることは、この思想に逆行し、「更新忘れ」によるサービス停止という、人為的ミス(トラブル)の温床となります。
▼自動化の鍵:「DNS-01チャレンジ」
この“完全自動化”を実現する上で、最も強力な武器が、「DNS-01チャレンジ」という、ドメイン所有権の確認方法です。
例えるなら…
郵便局(Let's Encrypt)が、あなたの住所(ドメイン)の本人確認をしたい時。
・ 旧来の方法(HTTP-01): あなたの家の玄関(サーバーの80番ポート)に、「確認に来ました」と、直接、訪問する。家の玄関を、常に、公道に晒しておく必要がある。
・ DNS-01: 郵便局が、あなたにだけ分かる“秘密の合言葉”を伝える。あなたは、自宅の表札の横(DNSのTXTレコード)に、その合言葉を、一時的に書き出す。郵便局員は、遠くから、その表札を見て、「確かに、本人だ」と確認する。あなたの家に、直接、訪問する必要はない。
この「表札を書き換える」作業を、プログラム(Certbot)が、API経由で、自動で行うのが、DNS-01チャレンジの神髄です。これにより、サーバーを外部に公開する必要がなく、ワイルドカード証明書も取得可能になるなど、圧倒的な柔軟性が手に入ります。
今すぐできる!自動更新スクリプト導入への“3ステップ準備”
今回は、API対応DNSサービスの代表格である「Cloudflare」を例に、説明します。
1. Certbotと、DNSプラグインをインストールする
所要時間の目安: 5分
必要な物: HomeLabサーバーの管理者権限付きターミナル
お使いのLinuxディストリビューションのパッケージマネージャーで、Certbot本体と、Cloudflare用のDNSプラグインを、インストールします。
Plaintext
# Debian/Ubuntu系の場合
sudo apt update
sudo apt install certbot python3-certbot-dns-cloudflare2. DNSプロバイダーのAPI認証情報を、準備する
所要時間の目安: 5分
必要な物: Cloudflareのアカウント
Certbotが、あなたの代わりに、DNSレコードを書き換えるための“許可証(APIトークン)”を、用意します。
1, Cloudflareのダッシュボードにログインし、「マイプロフィール」→「APIトークン」→「APIトークンを作成する」へ進みます。
2, 「Edit zone DNS」テンプレートを使い、操作対象のゾーン(ドメイン)を指定して、APIトークンを作成します。
3, 作成したトークンを、サーバーの安全な場所に、以下の形式で保存します。
Ini, TOML
# /etc/letsencrypt/cloudflare.ini などに保存
dns_cloudflare_api_token = "ここに、あなたのAPIトークンを貼り付け"4, このファイルのパーミッションを、所有者以外、読み取れないように、厳格に設定します。
Plaintext
sudo chmod 600 /etc/letsencrypt/cloudflare.ini3. 最初の証明書を“手動”で取得し、動作確認する
所要時間の目安: 5分
必要な物: (同上)
まず、一度だけ、手動でコマンドを実行し、証明書が、正しく取得できるか、確認します。
Plaintext
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
-d your-domain.com \
-d *.your-domain.com(your-domain.comの部分を、あなたのドメイン名に置き換えてください) Successfully received certificateと表示されれば、準備は完了です。
詳細ガイド&追加の豆知識
● コピペで使える!全自動更新スクリプト
証明書の更新、および、更新後のサービス再起動を、一括で行う、シェルスクリプトを作成します。
Bash
#!/bin/bash
# /usr/local/bin/renew_certs.sh などの名前で保存
# --- ユーザー設定項目 ---
# Certbotの実行パス
CERTBOT_CMD="/usr/bin/certbot"
# Cloudflareの認証情報ファイル
CLOUDFLARE_CREDS="/etc/letsencrypt/cloudflare.ini"
# ログファイル
LOG_FILE="/var/log/letsencrypt/renewal.log"
# 証明書を更新した後に、再起動が必要なサービス(例: Nginxリバースプロキシ)
DEPLOY_HOOK_CMD="sudo systemctl restart nginx"
# --- スクリプト本体 ---
echo "--- Cert renewal process started at $(date) ---" >> ${LOG_FILE}
# Certbotの更新コマンドを実行。--deploy-hookで、更新成功時のみ、サービスを再起動
${CERTBOT_CMD} renew \
--dns-cloudflare \
--dns-cloudflare-credentials ${CLOUDFLARE_CREDS} \
--deploy-hook "${DEPLOY_HOOK_CMD}" >> ${LOG_FILE} 2>&1
echo "--- Cert renewal process finished at $(date) ---" >> ${LOG_FILE}
echo "" >> ${LOG_FILE}
exit 0● cronに、スクリプトを“予約”する
最後に、このスクリプトを、システムに、自動で、定期実行するように、予約します。
sudo crontab -eコマンドで、cronの設定ファイルを開きます。
ファイルの末尾に、以下の一行を追記します。
Plaintext
15 4,16 * * * /usr/local/bin/renew_certs.shTips:cron設定の意味
これは「毎日、午前4時15分と、午後4時15分に、このスクリプトを実行せよ」という命令です。1日に2回実行しておくことで、どちらかのタイミングで、ネットワークの問題などが発生しても、もう片方で、リトライが効き、更新の成功率が、格段に上がります。
まとめ
要点①: Let's Encryptの証明書更新は、CertbotとDNS-01チャレンジを使い、完全に自動化するのが、現代のHomeLab運用の常識。
要点②: DNSプラグインとAPIキーを準備し、certbot renewコマンドを、シェルスクリプト化するのが、確実な自動化への、最短ルート。
要点③: 更新した証明書を、サービスに反映させる--deploy-hookと、実行結果を、後から確認できるログ出力の設定が、安定運用の鍵を握る。
再発防止ポイント: APIキーなどの認証情報を記述したファイル(.iniファイルなど)の、パーミッション(権限)を、必ず600に設定し、所有者(root)以外が、絶対に読み取れないようにすること。これが、セキュリティ上の、絶対的な鉄則です。
おまけ:ナベキンファトリー紹介
24時間365日、証明書の自動更新のような、重要なタスクを任せるHomeLabの“心臓部”には、やはり、省電力で、信頼性の高い、安定したサーバーが不可欠です。
中古PCとOA機器の専門店 ナベキンファトリー では、HomeLabサーバーとしても最適な、エンタープライズグレードの、高品質な中古サーバーや、小型PCも取り扱っています。興味があればぜひチェックしてみてくださいね。
#OA機器
#HomeLab
#Let 's_Encrypt
#スクリプト
#ナベキンファクトリー


コメント