Let's Encryptの設定方法|無料SSL証明書の取得と自動更新
Let's Encryptで無料のSSL証明書を取得する方法を解説。Certbotを使った設定手順、自動更新の設定、トラブルシューティングまで詳しく紹介します。
Let's Encryptは、無料でSSL証明書を発行できる認証局です。Certbotを使えば、証明書の取得から自動更新まで簡単に設定できます。
Let's Encryptとは
Let's Encryptは、非営利団体ISRGが運営する無料の認証局(CA)です。
特徴
| 項目 | 内容 |
|---|---|
| 費用 | 無料 |
| 有効期間 | 90日 |
| 自動更新 | 対応 |
| ワイルドカード | 対応(DNS認証が必要) |
| 信頼性 | 主要ブラウザすべてで信頼済み |
有料SSL証明書との違い
| 項目 | Let's Encrypt | 有料SSL |
|---|---|---|
| 費用 | 無料 | 年間数千円〜 |
| 有効期間 | 90日 | 1年 |
| 認証レベル | DV(ドメイン認証)のみ | DV/OV/EV |
| サポート | コミュニティ | ベンダーサポート |
| 保証 | なし | あり(一部) |
結論: 一般的なWebサイトにはLet's Encryptで十分です。
事前準備
必要なもの
- サーバーへのSSH接続(root権限)
- ドメインがサーバーのIPを指している
- ポート80(HTTP)と443(HTTPS)が開放されている
対応環境
- Nginx
- Apache
- その他(スタンドアロンモード)
Certbotのインストール
Ubuntu/Debian
sudo apt update
sudo apt install certbot
Nginxプラグイン:
sudo apt install python3-certbot-nginx
Apacheプラグイン:
sudo apt install python3-certbot-apache
CentOS/RHEL
sudo dnf install epel-release
sudo dnf install certbot
macOS(開発用)
brew install certbot
証明書の取得
Nginx環境
sudo certbot --nginx -d example.com -d www.example.com
対話形式で以下を入力:
- メールアドレス(更新通知用)
- 利用規約への同意
- HTTPからHTTPSへのリダイレクト設定
Apache環境
sudo certbot --apache -d example.com -d www.example.com
スタンドアロンモード
Webサーバーを一時停止して取得:
sudo systemctl stop nginx
sudo certbot certonly --standalone -d example.com
sudo systemctl start nginx
DNSチャレンジ(ワイルドカード証明書)
sudo certbot certonly --manual --preferred-challenges dns -d "*.example.com" -d example.com
指示に従ってDNSにTXTレコードを追加:
_acme-challenge.example.com TXT "ランダムな文字列"
証明書の確認
取得した証明書の一覧
sudo certbot certificates
証明書の場所
/etc/letsencrypt/live/example.com/
├── cert.pem # 証明書
├── chain.pem # 中間証明書
├── fullchain.pem # 証明書 + 中間証明書
└── privkey.pem # 秘密鍵
有効期限の確認
sudo openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -noout -dates
Webサーバーの設定
Nginx設定例
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# 推奨SSL設定
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
# HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
# HTTPからHTTPSへリダイレクト
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
Apache設定例
<VirtualHost *:443>
ServerName example.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
# 推奨SSL設定
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
</VirtualHost>
# HTTPからHTTPSへリダイレクト
<VirtualHost *:80>
ServerName example.com
Redirect permanent / https://example.com/
</VirtualHost>
自動更新の設定
Let's Encryptの証明書は90日で期限切れになるため、自動更新が必須です。
更新テスト
sudo certbot renew --dry-run
Cronで自動更新
sudo crontab -e
以下を追加(毎日2回チェック):
0 0,12 * * * /usr/bin/certbot renew --quiet
Systemd Timerで自動更新
多くのディストリビューションではデフォルトで有効:
sudo systemctl status certbot.timer
トラブルシューティング
「ドメインの検証に失敗しました」
原因1: DNSが反映されていない
dig example.com A +short
# サーバーのIPが表示されるか確認
原因2: ファイアウォールでポート80がブロック
sudo ufw allow 80
sudo ufw allow 443
原因3: Webサーバーが起動していない
sudo systemctl status nginx
「レート制限に達しました」
Let's Encryptには以下の制限があります:
| 制限 | 値 |
|---|---|
| 証明書発行数 | 50件/週/ドメイン |
| 失敗回数 | 5回/時間 |
| 重複証明書 | 5件/週 |
対処法: 1週間待つか、ステージング環境でテスト
sudo certbot --staging -d example.com
「自動更新が失敗する」
原因1: Webサーバーの設定が変更された
sudo certbot renew --force-renewal
原因2: ポート80がブロックされている
HTTP-01チャレンジにはポート80が必要です。
複数ドメインの管理
SANs(Subject Alternative Names)
sudo certbot --nginx -d example.com -d www.example.com -d blog.example.com
別々の証明書
sudo certbot --nginx -d site1.com
sudo certbot --nginx -d site2.com
証明書の削除
sudo certbot delete --cert-name example.com
監視の重要性
自動更新を設定していても、失敗することがあります。
よくある失敗原因:
- サーバー設定の変更
- DNSの変更
- ファイアウォールの変更
- ディスク容量不足
対策: RiskLensでSSL証明書の期限を監視し、期限が近づいたら通知を受け取りましょう。
まとめ
| 手順 | コマンド |
|---|---|
| インストール | apt install certbot |
| 証明書取得 | certbot --nginx -d example.com |
| 更新テスト | certbot renew --dry-run |
| 証明書確認 | certbot certificates |
Let's Encryptは無料で高品質なSSL証明書を提供しています。自動更新を正しく設定し、RiskLensで監視すれば、証明書の期限切れを防ぐことができます。