Let’s Encrypt証明書自動更新実装完全ガイド

Let’s EncryptでSSL/TLS証明書を導入したら、次は自動更新の設定が必須です。手動更新では運用コストが高く、更新忘れによるサイト停止リスクもあります。Certbotを使った自動更新設定で、証明書の有効期限切れを防ぎましょう。


目次


はじめに:なぜ自動更新が必要か

Let’s Encryptの証明書は90日間で有効期限が切れます。手動で更新する場合、以下の課題が発生します。

  • 運用コストの増加:90日ごとに更新作業が発生し、人的リソースが必要
  • サイト停止リスク:更新忘れや手順ミスでサイトがHTTPS非対応に
  • セキュリティリスク:古い証明書のまま放置すると暗号化が弱体化

自動更新を設定すれば、これらのリスクを回避できます。Certbotの自動更新機能を活用し、運用負荷を大幅に軽減しましょう。

出典: Let’s Encrypt公式ブログ「What to Expect When Let’s Encrypt」


前提条件:システム要件の確認

自動更新を実施する前に、以下の条件を満たしていることを確認してください。

項目要件確認方法
OSLinux(Ubuntu 20.04/22.04、CentOS 7/8、Debian 10/11)lsb_release -a または cat /etc/os-release
WebサーバーNginx、Apache、またはスタンドアロンモードnginx -v または apache2 -v
DNS設定ドメインのAレコードが正しく設定されているdig example.com A +short
ポート80番(HTTP)と443番(HTTPS)が開放されているsudo netstat -tulnp | grep -E '80|443'
ファイアウォールufwまたはfirewalldで80/443ポートが許可されているsudo ufw status または sudo firewall-cmd --list-all

上記の要件を満たしていない場合は、まずシステムの準備を行ってください。


Certbotのインストール手順

CertbotはLet’s Encryptの公式クライアントで、証明書の発行・更新・自動化を支援します。以下の手順でインストールしてください。

Ubuntu/Debian…

# 依存パッケージのインストール
sudo apt update
sudo apt install -y certbot python3-certbot-nginx

Certbotのバージョン確認

certbot --version

CentOS/RHELの場合

# EPELリポジトリの有効化
sudo yum install -y epel-release

Certbotのインストール

sudo yum install -y certbot python3-certbot-nginx

Certbotのバージョン確認

certbot --version

スタンドアロンモードの場合

Webサーバーを使用しない場合は、スタンドアロンモードでCertbotを実行します。

# スタンドアロンモード用のパッケージインストール
sudo apt install -y certbot  # Ubuntu/Debian
sudo yum install -y certbot  # CentOS/RHEL

スタンドアロンモードで実行(80/443ポートが空いている必要あり)

sudo certbot certonly --standalone -d example.com

インストール後は、Certbotが正常に動作することを確認します。

sudo certbot --help

上記コマンドでCertbotのヘルプが表示されれば、インストールは成功です。


Let’s Encrypt証明書の発行

Certbotを使ってLet’s Encrypt証明書を発行します。発行方法はWebサーバーの種類によって異なります。

Nginxを使用する場合

Nginxを使用している場合は、CertbotのNginxプラグインを利用します。

# Nginxプラグインを使った証明書発行
sudo certbot --nginx -d example.com -d www.example.com

実行すると、以下のような対話形式で設定が進みます。

  • メールアドレスの入力(Let’s Encryptからの通知用)
  • 利用規約への同意
  • HTTPからHTTPSへのリダイレクト設定の選択

成功すると、以下のような出力が表示されます。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your cert will expire on 2024-05-15. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"

Apacheを使用する場合

Apacheを使用している場合は、CertbotのApacheプラグインを利用します。

# Apacheプラグインを使った証明書発行
sudo certbot --apache -d example.com -d www.example.com

スタンドアロンモードの場合

Webサーバーを使用しない場合は、スタンドアロンモードで証明書を発行します。

# スタンドアロンモードで証明書発行
sudo certbot certonly --standalone -d example.com -d www.example.com

発行された証明書は、/etc/letsencrypt/live/ ディレクトリ以下に保存されます。主なファイルは以下の通りです。

ファイル名内容
cert.pemサーバー証明書
chain.pem中間証明書
fullchain.pemサーバー証明書 + 中間証明書
privkey.pem秘密鍵

証明書の有効期限は90日間です。自動更新を設定しないと、90日ごとに手動で更新する必要があります。


自動更新の設定方法

Certbotには自動更新機能が組み込まれています。以下の手順で自動更新を設定しましょう。

1. 手動更新のテスト

自動更新を設定する前に、手動で更新ができることを確認します。

# 手動更新の実行
sudo certbot renew --dry-run

成功すると、以下のような出力が表示されます。

...
- Congratulations, all renewals succeeded. The following certs were renewed:
  /etc/letsencrypt/live/example.com/fullchain.pem (success)

–dry-runオプションを付けると、実際の更新は行われません。テストとして実行してください。

2. 自動更新の設定

自動更新は、Certbotのシステムサービスとして登録します。以下の手順で設定します。

Ubuntu/Debianの場合

# systemdサービスの作成
sudo systemctl edit --force --full certbot.timer

以下の内容を貼り付け

[Unit] Description=Certbot Renewal Timer [Timer] OnCalendar=*-*-* 03:00:00 RandomizedDelaySec=1h Persistent=true [Install] WantedBy=timers.target

設定後、サービスを有効化します。

# タイマーの有効化
sudo systemctl enable --now certbot.timer

タイマーの状態確認

sudo systemctl list-timers | grep certbot

CentOS/RHELの場合

CentOS/RHELでは、cronを使って自動更新を設定します。

# cronジョブの編集
sudo crontab -e

以下の行を追加(毎日3時に実行、ランダムな遅延1時間以内)

0 3 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"

–quietオプションを付けると、更新が成功した場合にメールが送信されません。–post-hookオプションを使って、更新後にWebサーバーを再読み込みします。

3. 自動更新の動作確認

自動更新が正常に動作することを確認します。

# 手動でタイマーを実行
sudo systemctl start certbot.service

ログの確認

sudo journalctl -u certbot.service -f

正常に動作すれば、以下のようなログが表示されます。

...
Processing /etc/letsencrypt/renewal/example.com.conf
- Installing new certificate
- Replacing cert with cert from /etc/letsencrypt/live/example.com/fullchain.pem
- Congratulations, all renewals succeeded. The following certs were renewed:
  /etc/letsencrypt/live/example.com/fullchain.pem (success)

自動更新が成功すれば、90日間の有効期限が自動で延長されます。


NginxでのSSL設定反映

Let’s Encrypt証明書をNginxで使用するには、SSL設定を反映する必要があります。以下の手順で設定します。

1. NginxのSSL設…

NginxのSSL設定は、以下のテンプレートを参考にしてください。

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_stapling on;
    ssl_stapling_verify on;

    # その他の設定
    root /var/www/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

上記の設定では、以下の点に注意してください。

  • ssl_certificatessl_certificate_keyに、Let’s Encrypt証明書のパスを指定
  • ssl_protocolsでTLS 1.2と1.3を有効化
  • 80番ポートでHTTPアクセスがあった場合、HTTPSにリダイレクト

2. Nginxの設定反映

設定ファイルを保存したら、Nginxを再読み込みします。

# 構文チェック
sudo nginx -t

Nginxの再読み込み

sudo systemctl reload nginx

構文チェックでエラーがなければ、Nginxが再読み込みされます。SSL設定が反映されていることを確認しましょう。

3. SSL Labsによ…

SSL Labsのテストサイト(https://www.ssllabs.com/ssltest/)で、SSL/TLSの設定をテストできます。以下の点を確認してください。

  • 証明書が正しく表示される
  • 暗号スイートが最新のものに設定されている
  • TLS 1.0/1.1が無効化されている
  • サーバー名指定(SNI)が有効化されている

出典: SSL Labs Best Practices


トラブルシューティング:よくあるエラーと対処法

自動更新を設定する際に発生するエラーとその対処法を紹介します。

エラー原因対処法
Connection refusedポート80/443が開放されていないファイアウォールの設定を確認し、ポートを開放
Too many certificates already issued1週間に5回以上の証明書発行リクエスト既存の証明書を再利用するか、1週間待ってから再試行
DNS problem: NXDOMAIN looking up A for example.comドメインのDNS設定が正しくないDNS Aレコードを確認し、正しく設定されていることを確認
certbot: command not foundCertbotがインストールされていないCertbotを再インストールし、パスが通っていることを確認
429 Too Many RequestsLet’s Encryptのレート制限に引っかかった1時間待ってから再試行、または既存の証明書を再利用

エラーが発生した場合は、まずログを確認しましょう。

# Certbotのログ確認
sudo journalctl -u certbot.service -n 50 --no-pager

Nginxのエラーログ確認

sudo tail -n 50 /var/log/nginx/error.log

ログからエラーの原因を特定し、適切な対処を行ってください。


セキュリティ考慮点:安全な運用のために

Let’s Encryptを安全に運用するためのセキュリティ考慮点を紹介します。

1. 秘密鍵の保護

Let’s Encryptの秘密鍵(privkey.pem)は、以下の方法で保護してください。

  • ファイル権限の設定:秘密鍵の権限を600に設定
  • sudo chmod 600 /etc/letsencrypt/live/example.com/privkey.pem
  • 定期的なバックアップ:秘密鍵をバックアップし、安全な場所に保管
  • 鍵のローテーション:証明書更新時に秘密鍵を再生成

2. 自動更新のセキュリティ

自動更新を設定する際は、以下の点に注意してください。

  • 更新の通知:更新が成功したかどうかをメールで通知する
  • # 更新通知の設定(cronジョブに追加)
    0 3 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx" && echo "SSL証明書が更新されました" | mail -s "SSL証明書更新通知" admin@example.com
  • 更新失敗時の対応:更新に失敗した場合は、即座に対応する仕組みを用意
  • テスト環境での検証:本番環境に反映する前に、テスト環境で動作を確認

3. セキュリティヘッダー…

Nginxでセキュリティヘッダーを設定し、HTTPSの安全性を高めましょう。

add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;

上記のヘッダーを設定することで、以下のセキュリティ機能が有効化されます。

  • HSTS(HTTP Strict Transport Security):ブラウザにHTTPS接続を強制
  • X-Content-Type-Options:MIMEスニッフィングを防止
  • X-Frame-Options:クリックジャッキングを防止
  • X-XSS-Protection:XSS攻撃を防止
  • Referrer-Policy:リファラ情報の漏洩を防止

出典: OWASP HTTP Headers Cheat Sheet


まとめ:自動更新で運用負荷を軽減

Let’s Encryptの証明書を自動更新することで、以下のメリットが得られます。

  • 運用負荷の軽減:90日ごとの手動更新が不要に
  • サイト停止リスクの回避:更新忘れによるHTTPS非対応を防止
  • セキュリティの向上:常に最新の暗号化設定を維持
  • コスト削減:人的リソースの削減によるコスト削減

自動更新の設定は、以下の手順で行います。

  1. Certbotをインストールし、証明書を発行
  2. 手動更新のテストを実施
  3. 自動更新のタイマー(またはcronジョブ)を設定
  4. NginxのSSL設定を反映
  5. 動作確認とログの監視

Let’s Encryptの証明書は無料で発行でき、自動更新を設定すれば運用負荷を大幅に軽減できます。ぜひこの機会に自動更新を導入し、安全なWebサイト運用を実現しましょう。

出典: Let’s Encrypt公式ブログ「Certbot 1.22.0 Released」


FAQ:Let’s Encrypt自動更新に関する5つの疑問

Let’s Encryptの自動更新に関するよくある質問と回答をまとめました。

Q1. 自動更新は本当に安…

A1. 自動更新は安全です。Certbotは公式のクライアントで、Let’s Encryptの認証局と安全に通信します。ただし、以下の点に注意してください。

  • 秘密鍵は適切に保護し、ファイル権限を600に設定
  • 更新通知を設定し、更新の成否を確認
  • テスト環境で動作を確認してから本番環境に反映

Q2. 自動更新に失敗した…

A2. 自動更新に失敗した場合は、以下の手順で対処してください。

  1. ログを確認し、エラーの原因を特定
  2. sudo journalctl -u certbot.service -n 50 --no-pager
  3. 手動で更新を実行
  4. sudo certbot renew --force-renewal
  5. Webサーバーを再読み込み
  6. sudo systemctl reload nginx
  7. 更新が成功したら、自動更新の設定を見直し

Q3. 複数のドメインを管…

A3. 複数のドメインを管理している場合は、以下の方法で自動更新を設定します。

  • Certbotの同時発行:複数のドメインを同時に発行
  • sudo certbot --nginx -d example.com -d www.example.com -d blog.example.com
  • 自動更新の設定:発行した証明書は自動的に更新対象に含まれる
  • 更新確認:以下のコマンドで更新対象の証明書を確認
  • sudo certbot certificates

Q4. 自動更新の頻度はど…

A4. Let’s Encryptの証明書は90日間有効ですが、自動更新は30日に1回実行されます。これは、証明書の有効期限が切れる前に更新できるようにするためです。

  • 自動更新の実行頻度:30日に1回
  • 更新が実行されるタイミング:証明書の有効期限の30日前から
  • 更新が成功する条件:ポート80/443が開放されていること

出典: Let’s Encrypt FAQ

Q5. 自動更新を設定する…

A5. 自動更新を設定する際は、以下の注意点を確認してください。

  • ポートの開放:80番(HTTP)と443番(HTTPS)ポートが開放されていること
  • DNS設定:ドメインのAレコードが正しく設定されていること
  • ファイアウォール:ufwやfirewalldでポートが許可されていること
  • Webサーバー:NginxやApacheが正常に動作していること
  • メールアドレス:Let’s Encryptからの通知を受け取るメールアドレスを設定

これらの条件を満たしていないと、自動更新が失敗する可能性があります。設定前に必ず確認してください。

出典: Certbot公式ドキュメント

【編集・制作ポリシー】
本記事はRoute Bloom編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。
ABOUT ME
たから
サラリーマンをしながら開業して経営やってます。 今年、本業で独立・別事業を起業予定です。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900/FE/サーティファイC言語 ◆サイドビジネス:アパレル事業/複数のWEBメディアを運営