Certbot SSL証明書:5分でインストールと自動更新を完了する方法

Security tutorial - IT technology blog
Security tutorial - IT technology blog

今すぐやろう:5分でドメインにHTTPSを設定する

ブラウザが自分のウェブサイトで「保護されていない通信」と警告を表示しているのを見てこの記事にたどり着いたなら、安心してください。数分で解決できます。さっそくコマンドから始めましょう。

Ubuntu/DebianにCertbotをインストールする:

sudo apt update
sudo apt install certbot python3-certbot-nginx -y

ドメインに証明書を発行する(yourdomain.comを実際のドメインに置き換えてください):

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

CertbotはSSL証明書の有効期限が近づいた際の警告送付先メールアドレスを尋ね、NginxのconfigをHTTPS対応に自動修正します。これで完了です。ブラウザにすぐ鍵マークが表示されます。

自動更新が正常に動作しているか確認する:

sudo certbot renew --dry-run

Congratulations, all simulated renewals succeededと表示されれば問題ありません。

なぜSSLが必要なのか——そしてLet’s Encryptが特別な理由

10台以上のサーバーのセキュリティ監査を経験してきた中で、同じパターンを繰り返し見てきました:平文のHTTP、暗号化なし。ログインフォーム、セッションcookie、果てはWordPressの管理者パスワードまで、すべてのデータがネットワーク上をプレーンテキストで流れています。Wiresharkがあれば、カフェでも管理されていないスイッチのオフィスでも、同じネットワーク上にいれば誰でも傍受できてしまいます。

SSL/TLSはブラウザとサーバー間のすべてのトラフィックを暗号化します。コンセプトはシンプルです。問題は、以前は証明書の購入に年間$50〜$200かかり、手動設定が必要だったため、面倒に感じてスキップする人が多かったことです。

Let’s Encryptはその常識を覆しました:無料で、自動で、主要ブラウザすべてが信頼する証明書を発行します。Certbotは公式ツールで、ドメイン認証から証明書発行、Webサーバーへのインストール、定期更新まですべてを担います。初回セットアップさえ終われば、あとは何もしなくてよいのです。

仕組みを理解する(エラー発生時のデバッグのために)

Certbotはドメインの所有者であることを、以下のいずれかの方法で確認します:

HTTP-01チャレンジ(最も一般的)

Let’s Encryptがhttp://yourdomain.com/.well-known/acme-challenge/<token>にリクエストを送ります。Certbotはそのファイルをサーバー上に作成し、ファイルが正しい内容を返せば認証完了です。

ポート80が開いている必要があります。また、ドメインはサーバーのIPアドレスに正しく向いていなければなりません。エラーの90%はここが原因です——ファイアウォールでポート80がブロックされているか、DNSのpropagationが完了していないかのどちらかです。

DNS-01チャレンジ(Webサーバーがない場合に使用)

サーバー上にファイルを作成する代わりに、CertbotはドメインのDNSにTXTレコードを作成します。この方法は、サーバーがインターネットに公開されていない場合や、ワイルドカード証明書(*.yourdomain.com)が必要な場合に有効です。

# DNSチャレンジでワイルドカード証明書を取得する
sudo certbot certonly --manual --preferred-challenges dns \
  -d "*.yourdomain.com" -d yourdomain.com

このコマンドは、認証を続行する前にDNSへTXTレコードを手動で追加することを求めます。

よくある実践的なケース

NginxではなくApacheを使うサーバーの場合

sudo apt install certbot python3-certbot-apache -y
sudo certbot --apache -d yourdomain.com

Webサーバーを使わない場合(スタンドアロンモード)

Node.js、Python Flask、Goなど、アプリケーションをポート80/443で直接実行している場合はスタンドアロンモードを使います。Certbotは認証のために一時的にポートを占有し、完了後に返却します:

# まずポート80を使用しているサービスを停止する
sudo systemctl stop myapp
sudo certbot certonly --standalone -d yourdomain.com
sudo systemctl start myapp

複数のドメインを一度に取得する

sudo certbot --nginx \
  -d yourdomain.com \
  -d www.yourdomain.com \
  -d api.yourdomain.com \
  -d admin.yourdomain.com

Subject Alternative Namesにより、すべてのドメインが1枚の証明書にまとめられます——個別に取得するより効率的です。

現在の証明書一覧を確認する

sudo certbot certificates

ドメイン名、有効期限、証明書ファイルのパスが表示されます。

自動更新——設定を忘れずに

Let’s Encryptの証明書は90日で期限が切れます。商用証明書(1〜2年)より短いのは意図的な設計です:2年分の証明書を発行してサイトが警告表示になるまで忘れられるより、最初から自動化を促すためです。

aptでCertbotをインストールすると、1日2回チェックを行うsystemdタイマーが自動的に作成されます。ステータスを確認するには:

sudo systemctl status certbot.timer
# またはcronjobを確認する(systemdの代わりにcronを使う場合)
cat /etc/cron.d/certbot

さらに重要なのは、更新後にNginxをリロードして新しい証明書を適用させることです。deployフックを確認しましょう:

cat /etc/letsencrypt/renewal-hooks/deploy/

フックがなければ今すぐ追加しましょう:

cat > /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh << 'EOF'
#!/bin/bash
systemctl reload nginx
EOF
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh

運用経験から学んだ実践的なTips

1. opensslコマンドで証明書を確認する

# 有効期限を確認する
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com \
  < /dev/null 2>/dev/null | openssl x509 -noout -dates

# 証明書の全情報を確認する
openssl s_client -connect yourdomain.com:443 < /dev/null 2>/dev/null \
  | openssl x509 -noout -text | grep -A 2 "Subject Alternative"

2. よくあるエラーの対処法

「Connection refused」またはcertbot実行時のタイムアウト
→ ファイアウォールを確認:sudo ufw statusでポート80が開いていることを確かめてください。

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

「Too many certificates already issued for exact set of domains」
→ Let’s Encryptはドメインあたり週5枚まで上限があります。--stagingで事前にテストしてください:

sudo certbot --nginx --staging -d yourdomain.com

更新後もNginxが古い証明書を使い続ける
→ 手動でNginxをリロードしてください:sudo nginx -s reload。次回同じ問題が起きないよう、上記のdeployフックを追加することをお勧めします。

3. 証明書のバックアップ

証明書は/etc/letsencrypt/にあります——サーバー移行前にこのディレクトリをバックアップしておきましょう:

sudo tar -czf letsencrypt-backup-$(date +%Y%m%d).tar.gz /etc/letsencrypt/

4. 不要になった証明書を失効させる

sudo certbot revoke --cert-name yourdomain.com
sudo certbot delete --cert-name yourdomain.com

5. 自動モニタリング

このcronジョブは毎朝更新ログをメールで送信します——サーバーに手動でアクセスしなくても、エラーの有無をすぐ確認できます:

# crontabに追加:毎朝9時に確認する
0 9 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx" 2>&1 | mail -s "Certbot renew log" [email protected]

UptimeRobotやUptime Kumaを組み合わせて外部からモニタリングすれば、ユーザーから苦情が来てからではなく、証明書に問題が発生した時点でいち早く気づくことができます。

Share: