無料でSSL/TLS証明書を提供してくれる Let’s Encrypt。
HTTPS化が当たり前になった今、Webシステム運用における“定番中の定番”となっています。
本記事では、Let’s Encryptの基礎から仕組み、導入方法、認証処理の裏側まで、システムエンジニアの目線で徹底的に解説します。
✅ この記事でわかること
- Let’s Encryptとは何か?どんなメリットがあるか?
- CertbotやACMEプロトコルの役割と仕組み
- 実際の証明書取得・更新の裏側処理の流れ
-
/etc/letsencrypt
配下の構成と意味 - よくあるチャレンジ方式(HTTP-01 / DNS-01)の違いと用途
- Docker + CertbotでLet's Encrypt証明書を取得する手順(standaloneモード)
🔰 Let’s Encryptとは?
Let’s Encryptは、**ISRG(Internet Security Research Group)**が提供する、**無料のSSL/TLS証明書を発行する認証局(CA)**です。
- 対応証明書:ドメイン認証型(DV)証明書
- 主な目的:Web全体のHTTPS化促進
- 発行件数:世界中の数億サイトが利用
✅ システムエンジニア視点でのメリット
項目 | 内容 |
---|---|
💸 無料で証明書取得 | 商用CAと比べて運用コストゼロ |
⚙ 自動化前提 | ACMEプロトコル+Certbotで証明書取得・更新を完全自動化 |
🔁 短期間の有効期限(90日) | 自動更新前提。セキュリティリスクも低減 |
🔐 高い信頼性 | 主要なブラウザ・OSに信頼されている(クロス署名対応) |
🧩 ACMEとは?
ACME(Automatic Certificate Management Environment)は、Let’s Encryptが採用する証明書自動管理プロトコルです。
処理の流れ(HTTP-01チャレンジ):
- クライアント(Certbot)が証明書を要求
- Let’s Encryptが所有権確認のチャレンジを発行
- クライアントがトークンをWebサーバやDNSに配置
- Let’s Encryptが検証アクセス
- 成功すれば証明書が発行される
⚙ Certbotとは?
Let’s Encrypt公式が推奨する、Python製のACMEクライアントツールです。
基本的な使い方:
# Apache用(証明書取得+自動設定)
sudo certbot --apache -d example.com
# Nginx用
sudo certbot --nginx -d example.com
# Webroot指定(既存のWebサーバを使う)
sudo certbot --webroot -w /var/www/html -d example.com
更新と確認:
# 証明書の更新(通常は自動)
sudo certbot renew
# 更新シミュレーション
sudo certbot renew --dry-run
🔍Certbotで証明書取得時の内部処理(HTTP-01)
例コマンド:
sudo certbot --apache -d example.com
この1コマンドで、裏では以下のような処理が行われています。
🔄 内部処理の流れ:
-
CertbotがACMEサーバに接続
- ACMEエンドポイント(例:
https://acme-v02.api.letsencrypt.org
)にリクエスト送信
- ACMEエンドポイント(例:
-
チャレンジ受信(HTTP-01)
- トークン付きの検証リクエストを受信
- 例:
http://example.com/.well-known/acme-challenge/<トークン>
-
トークン配置
- CertbotがApache設定を一時変更して、トークンファイルをWeb経由で提供
-
Let’s Encryptが検証アクセス
- 指定URLにアクセスして、正しいレスポンスが返るかを確認
-
検証OK → 証明書発行
-
/etc/letsencrypt/live/example.com/
に証明書が保存される - WebサーバのHTTPS設定も自動反映(オプションによる)
-
🔁 簡易図(HTTP-01)
[Certbot] ──▶ [Let’s Encrypt]
│ │
▼ ▼
[Webサーバにトークン設置]
│
▼
[Let’s Encryptが確認アクセス]
│
▼
[証明書発行・保存]
🌐 チャレンジ方式まとめ
方式 | 概要 | 主な用途 |
---|---|---|
HTTP-01 | Web経由でトークンを設置して認証 | 一般的なWebサーバ構成に |
DNS-01 | DNSにTXTレコードを設定して認証 | CloudflareやRoute53などクラウド向け |
TLS-ALPN-01 | TLS拡張での検証(特殊用途) | 自前CAやISP向け特殊構成など |
📂 /etc/letsencrypt ディレクトリ構成
Let’s Encryptの証明書関連ファイルは以下のように構成されています。
/etc/letsencrypt/
├── live/ # 現在使用中の証明書
├── archive/ # 過去の証明書(履歴付き)
├── renewal/ # 自動更新用の設定ファイル
├── accounts/ # ACMEサーバとの登録情報
├── renewal-hooks/ # 更新後に実行するスクリプト(例:Webサーバ再起動)
例:live/ 配下
/etc/letsencrypt/live/example.com/
├── cert.pem # サーバ証明書
├── chain.pem # 中間証明書
├── fullchain.pem # Webサーバでよく使う形式
├── privkey.pem # 秘密鍵(超重要!)
💡 補足:Certbotが「どのドメインの証明書を取得するか」を知る仕組み
-
-d
オプションで明示的に指定:sudo certbot --apache -d example.com -d www.example.com
-
--apache
や--nginx
使用時は、VirtualHost設定からドメイン名を自動検出することも可能
🚦 注意点・制限
注意点 | 内容 |
---|---|
❌ OV / EV証明書は非対応 | ドメイン認証型のみ |
🚫 一部の企業・官公庁ではポリシー制限あり | 利用前に確認必須 |
📉 レートリミットあり | 大量発行や失敗連打に注意 |
🔁 ステージング環境(テスト用)
証明書の自動化テストやスクリプト検証には、ステージング環境を使うと安全です。
sudo certbot --server https://acme-staging-v02.api.letsencrypt.org/directory ...
📌 まとめ
項目 | ポイント |
---|---|
Let’s Encrypt | 無料のSSL/TLS証明書を発行する認証局 |
Certbot | ACMEクライアントで、証明書の自動取得・更新が可能 |
ACME | 証明書管理を自動化するプロトコル |
HTTP-01 / DNS-01 | ドメイン所有者確認の方式 |
自動化 |
certbot renew で90日ごとの更新を自動化 |
/etc/letsencrypt | 証明書・設定の保管場所(構造を理解するとトラブル対応しやすい) |
🐳 Docker + CertbotでLet's Encrypt証明書を取得する手順
✅ 前提条件
- Dockerがインストール済み
- 公開済みのWebサイト or ドメインがある(例:
example.com
) - そのドメインがすでに ポート80(HTTP)でアクセス可能 であること
- DNS設定済み(AレコードがサーバのIPを向いている)
📦 使用方法:HTTP-01チャレンジ + standaloneモード
CertbotのスタンドアロンWebサーバを一時的に起動して、証明書を取得する方法です。
🔧 手順
docker run --rm -it \
-p 80:80 \
-v certbot-etc:/etc/letsencrypt \
-v certbot-var:/var/lib/letsencrypt \
certbot/certbot certonly \
--standalone \
-d example.com \
--agree-tos \
--no-eff-email \
-m your-email@example.com
📌 各オプション解説
オプション | 説明 |
---|---|
-p 80:80 |
HTTP-01チャレンジで80番ポートを使用 |
-v certbot-etc:/etc/letsencrypt |
証明書データ保存先(永続化) |
/var/lib/letsencrypt。 |
内部的に使う一時ファイルや状態データを保持するディレクトリ |
--standalone |
一時的なWebサーバを起動してチャレンジ応答 |
-d example.com |
証明書を取得したいドメイン名 |
-m |
管理者メールアドレス(証明書期限切れ通知など) |
--agree-tos |
利用規約に同意 |
--no-eff-email |
EFFメーリングリストに登録しない |
📂 証明書の保存場所
取得後、ホスト側のDockerボリュームに以下のように保存されます:
/var/lib/docker/volumes/certbot-etc/_data/live/example.com/
├── cert.pem # サーバ証明書
├── chain.pem # 中間証明書
├── fullchain.pem # cert + chain
├── privkey.pem # 秘密鍵
🔁 自動更新の実行(cronやsystemd timerなどで)
docker run --rm \
-v certbot-etc:/etc/letsencrypt \
-v certbot-var:/var/lib/letsencrypt \
certbot/certbot renew
certbot renew
は90日の有効期限を迎える前に自動更新できます。
🛑 注意点
- この方法では一時的にポート80をCertbotが専有します。すでにNginxやApacheが稼働している場合、いったん停止する必要があります。
🧪 補足:テスト用にステージング環境で試す場合
Let’s EncryptにはRate Limitがあるため、テスト時は以下のようにステージング環境を使うと安全です。
--server https://acme-staging-v02.api.letsencrypt.org/directory
✅ まとめ
項目 | 内容 |
---|---|
使用モード |
--standalone (単体Webサーバで取得) |
必須条件 | ドメインがポート80で外部からアクセス可能 |
利用ツール | docker run certbot/certbot |
メリット | ローカル環境や軽量サーバでもすぐ取得できる |
永続化 | Docker Volumeを使って証明書データを保持 |