Let’s Encryptワイルドカード証明書からホスト毎のSAN証明書に変更

スポンサーリンク
RockyLinux
この記事は約10分で読めます。
ランキングに参加しています。応援よろしくお願いします。
ブログランキング・にほんブログ村へ 人気ブログランキングへ FC2ブログランキングへ
スポンサーリンク
この記事が気に入ったら
フォローしよう
最新情報をお届けします。

従来、ワイルドカード証明書を使用していましたが、お名前ドットコムのDNS環境では自動更新に対応しておらず、手動での更新作業が必要でした。
今回、SAN証明書への移行により自動更新が可能になり、運用コストの削減が実現できたため、その手順を記録します。

更新前のワイルドカード証明書

SAN(Subject Alternative Name)証明書(マルチドメイン証明書)は、1枚の証明書で複数の異なるドメイン名、ホスト名、またはIPアドレスを指定・保護できるサーバ証明書です。

  • 証明書の拡張フィールド「SAN」に最大100〜250個程度の追加名前を登録可能(認証局による)​
  • CN(Common Name)とSANを併用し、異なるドメイン(例: example.com と example.net)や特定サブドメイン、IPアドレスをカバー​
  • certbotなどのACMEクライアントで発行・更新しやすく、ApacheやIISなどのサーバで仮想ホスト対応

以下、両者の違いを比較表にまとめます。

項目ワイルドカード証明書SAN証明書 (マルチドメイン証明書)
対応範囲同一ドメインの全サブドメイン
(例: *.example.com でwww.example.com など無制限)
任意の複数ドメイン・ホスト・IPを明示指定
(例: example.com, www.example.com, example.net)
柔軟性サブドメイン専用で他ドメイン不可異なるドメイン対応可能だが、指定外は不可​
用途例大量サブドメインの一括管理少数の特定ホストやマルチドメイン管理
certbot対応一部環境で制限あり
(お名前ドットコムなど)
広く対応しやすく自動更新向き​
コスト・管理1ドメイン特化でシンプル複数指定でコスト効率高く拡張性あり
  • Certbot がインストール済みであること
  • Webサーバ(Nginx)が稼働していること
  • DNS設定で各ホスト名が正しく設定されていること
  • ポート80/443が解放されていること

以下のコマンドで、複数のドメイン/ホストを含むSAN証明書を発行します。

sudo certbot --nginx --cert-name maruweb.jp.net -d maruweb.jp.net -d marusrv.maruweb.jp.net -d www.maruweb.jp.net -d art.maruweb.jp.net

オプション説明:

  • –nginx: Nginxプラグインを使用
  • –cert-name: 証明書の識別名(既存証明書を上書きする場合に指定)
  • -d: 証明書に含めるドメイン/ホスト名(複数指定可能)
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
You are updating certificate maruweb.jp.net to include new domain(s):
+ art.maruweb.jp.net
+ marusrv.maruweb.jp.net
+ maruweb.jp.net
+ www.maruweb.jp.net

You are also removing previously included domain(s):
- *.maruweb.jp.net

Did you intend to make this change?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(U)pdate certificate/(C)ancel: U
Renewing an existing certificate for maruweb.jp.net and 3 more domains

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/maruweb.jp.net/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/maruweb.jp.net/privkey.pem
This certificate expires on 2025-12-21.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for maruweb.jp.net to /etc/nginx/nginx.conf
Successfully deployed certificate for marusrv.maruweb.jp.net to /etc/nginx/nginx.conf
Successfully deployed certificate for www.maruweb.jp.net to /etc/nginx/conf.d/www.maruweb.jp.net.conf
Successfully deployed certificate for art.maruweb.jp.net to /etc/nginx/conf.d/art.maruweb.jp.net.conf
Your existing certificate has been successfully renewed, and the new certificate has been installed.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

既存のワイルドカード証明書のディレクトリを上書きしSAN証明書を発行します。

sudo systemctl reload nginx
sudo systemctl restart cockpit

SAN証明書に含まれるホストを確認します。

sudo openssl x509 -in /etc/letsencrypt/live/maruweb.jp.net/fullchain.pem -text -noout | grep DNS:
DNS:art.maruweb.jp.net, DNS:marusrv.maruweb.jp.net, DNS:maruweb.jp.net, DNS:www.maruweb.jp.net

証明書の更新を自動実行するためのサービスを起動します。

sudo systemctl enable --now certbot-renew.timer

タイマーの確認

sudo systemctl list-timers | grep certbot
Tue 2025-09-23 07:24:15 JST 8h left      Mon 2025-09-22 22:57:00 JST 10min ago certbot-renew.timer          certbot-renew.service

証明書が自動更新された場合、NginxやCockpitのサービスを再読み込みさせる必要があるのでスクリプトを作成します。

sudo vi /etc/letsencrypt/renewal-hooks/deploy/reload-services.sh
#!/bin/bash
# 証明書更新後に自動実行される
systemctl reload nginx
systemctl restart cockpit
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-services.sh
ls -la /etc/letsencrypt/renewal-hooks/deploy/
total 12
drwxr-xr-x 2 root root 4096 Sep 22 23:22 .
drwxr-xr-x 5 root root 4096 Oct  8  2024 ..
-rwxr-xr-x 1 root root  106 Sep 22 23:22 reload-services.sh
sudo ls -la /etc/letsencrypt/live/maruweb.jp.net/
total 12
drwxr-xr-x 2 root root 4096 Nov 22 08:24 .
drwx------ 3 root root 4096 Sep 22 22:17 ..
-rw-r--r-- 1 root root  692 Oct  9  2024 README
lrwxrwxrwx 1 root root   38 Nov 22 08:24 cert.pem -> ../../archive/maruweb.jp.net/cert6.pem
lrwxrwxrwx 1 root root   39 Nov 22 08:24 chain.pem -> ../../archive/maruweb.jp.net/chain6.pem
lrwxrwxrwx 1 root root   43 Nov 22 08:24 fullchain.pem -> ../../archive/maruweb.jp.net/fullchain6.pem
lrwxrwxrwx 1 root root   41 Nov 22 08:24 privkey.pem -> ../../archive/maruweb.jp.net/privkey6.pem

ファイルの更新日時が11月22日となっているのが確認できます。

発行日がこちらも11月22日、有効期限も2026年2月20日と更新されているのが確認できます。

ホスト名も含められています。

  • 新しいホストを追加する場合
    既存のSAN証明書に新しいホストを追加する際は、すべてのホスト名を再度指定する必要があります。一部のみを指定すると、指定しなかったホストが証明書から除外されます。
  • ホスト数の上限
    Let’s Encryptでは1つの証明書に最大100個のホスト名を含めることができます。
  • 更新の仕組み
    certbot-renew.timerは1日2回実行され、有効期限まで30日を切った証明書を自動更新します。
  • 自動更新が失敗する場合
    更新ログを確認:
    sudo journalctl -u certbot-renew.service
  • 手動で更新テスト:
    sudo certbot renew --dry-run
  • Nginxの設定エラーの場合
    設定ファイルの構文チェック:
    sudo nginx -t
sudo journalctl -u certbot-renew.service

SAN証明書への移行により、以下のメリットが得られました。

【改善点】

  • 手動更新作業の削除(3ヶ月1回の作業が不要に)
  • 更新忘れのリスク排除
  • 複数ホストを1枚の証明書で管理可能
  • 自動更新による運用負荷の軽減

【今後の展開】
新しいサブドメインを追加する際は、全ホスト名を指定してcertbotコマンドを実行するだけで、簡単に証明書を更新できます。

Let’s Encryptの自動更新により、証明書管理の手間が大幅に削減され、より本質的な作業に集中できる環境が整いました。

コメント

タイトルとURLをコピーしました