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

無料で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クライアントツール**です。

### 基本的な使い方：

```bash
# 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
```

### 更新と確認：

```bash
# 証明書の更新（通常は自動）
sudo certbot renew

# 更新シミュレーション
sudo certbot renew --dry-run
```

---

## 🔍Certbotで証明書取得時の内部処理（HTTP-01）

### 例コマンド：

```bash
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/ 配下

```bash
/etc/letsencrypt/live/example.com/
├── cert.pem        # サーバ証明書
├── chain.pem       # 中間証明書
├── fullchain.pem   # Webサーバでよく使う形式
├── privkey.pem     # 秘密鍵（超重要！）
```

---

## 💡 補足：Certbotが「どのドメインの証明書を取得するか」を知る仕組み

* `-d` オプションで明示的に指定：

  ```bash
  sudo certbot --apache -d example.com -d www.example.com
  ```
* `--apache` や `--nginx` 使用時は、VirtualHost設定からドメイン名を**自動検出**することも可能

---

## 🚦 注意点・制限

| 注意点                    | 内容           |
| ---------------------- | ------------ |
| ❌ OV / EV証明書は非対応       | ドメイン認証型のみ    |
| 🚫 一部の企業・官公庁ではポリシー制限あり | 利用前に確認必須     |
| 📉 レートリミットあり           | 大量発行や失敗連打に注意 |

---

## 🔁 ステージング環境（テスト用）

証明書の自動化テストやスクリプト検証には、ステージング環境を使うと安全です。

```bash
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サーバを一時的に起動して、証明書を取得する方法です。

---

### 🔧 手順

```bash
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などで）

```bash
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**があるため、テスト時は以下のようにステージング環境を使うと安全です。

```bash
--server https://acme-staging-v02.api.letsencrypt.org/directory
```

---

### ✅ まとめ

| 項目    | 内容                           |
| ----- | ---------------------------- |
| 使用モード | `--standalone`（単体Webサーバで取得）  |
| 必須条件  | ドメインがポート80で外部からアクセス可能        |
| 利用ツール | `docker run certbot/certbot` |
| メリット  | ローカル環境や軽量サーバでもすぐ取得できる        |
| 永続化   | Docker Volumeを使って証明書データを保持   |