0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【エンジニア向け】Let’s Encrypt + Certbotで無料SSL完全ガイド:仕組み・導入・裏側の流れまで

Posted at

無料で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チャレンジ):

  1. クライアント(Certbot)が証明書を要求
  2. Let’s Encryptが所有権確認のチャレンジを発行
  3. クライアントがトークンをWebサーバやDNSに配置
  4. Let’s Encryptが検証アクセス
  5. 成功すれば証明書が発行される

⚙ 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コマンドで、裏では以下のような処理が行われています。

🔄 内部処理の流れ:

  1. CertbotがACMEサーバに接続

    • ACMEエンドポイント(例:https://acme-v02.api.letsencrypt.org)にリクエスト送信
  2. チャレンジ受信(HTTP-01)

    • トークン付きの検証リクエストを受信
    • 例:http://example.com/.well-known/acme-challenge/<トークン>
  3. トークン配置

    • CertbotがApache設定を一時変更して、トークンファイルをWeb経由で提供
  4. Let’s Encryptが検証アクセス

    • 指定URLにアクセスして、正しいレスポンスが返るかを確認
  5. 検証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を使って証明書データを保持
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?