Certbot Webroot 設定手順書


対象OS Ubuntu 20.04/22.04、Debian 11/12、RHEL 8/9、AlmaLinux 8/9、Rocky Linux 8/9
Webサーバ Apache / Nginx
ACMEクライアント Certbot(webrootプラグイン)
認証方式 HTTP-01(webrootモード)

概要

webrootモードの仕組み

webrootモードでは、ACMEサーバからのチャレンジファイルを既存Webサーバのドキュメントルート配下に配置することで、ドメインの所有権を証明します。Webサーバを停止する必要はありません。

① Certbot

チャレンジファイルを /.well-known/acme-challenge/ に配置

② ACMEサーバ

HTTP経由でファイルにアクセスし、ドメイン所有権を検証

③ 証明書発行

検証成功により証明書を発行

事前準備・前提条件

項目 内容
ドメイン 証明書を取得するFQDN(例:example.com)が確定していること
DNSレコード AレコードがサーバのグローバルIPを向いていること
80番ポート 外部からHTTPアクセス(TCP/80)が到達できること
Webサーバ動作 Apache または Nginx が稼働していること
認証局情報 ACME Server URL / Key ID / HMAC Key がSSLセキュア管理画面から取得済みであること
sudo権限 作業ユーザが sudo 実行できること

🟠 = Ubuntu/Debian向け手順 🔴 = RHEL/AlmaLinux/Rocky Linux向け手順 (表記なし = 共通)

設定手順

コマンドや設定ファイルの記述内容で、太字部分はお客様のお申込み内容に合わせて読み替えてください。

STEP 1Certbot のインストール


# snapd のインストール(未導入の場合)
sudo apt update && sudo apt install -y snapd

# 既存 certbot の削除(競合防止)
sudo apt remove certbot

# snap 経由でインストール
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

certbot --version

# EPEL リポジトリの有効化
sudo dnf install -y epel-release

# RHEL 9 の場合のみ(AlmaLinux/Rocky Linux は不要)
sudo subscription-manager repos --enable codeready-builder-for-rhel-9-x86_64-rpms

# 既存 certbot の削除(競合防止)
sudo dnf remove certbot

# snapd のインストール
sudo dnf install -y snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap

# 一度ログアウトして再ログイン後に実行
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

certbot --version

STEP 2EAB情報の確認

SSLセキュアの管理画面から以下の情報を取得してください。

パラメータ 説明
ACME Server URL 認証局のACMEエンドポイントURL(例:https://acme.example-ca.com/acme/directory
Key ID EAB用のキーID(アカウント識別子)
HMAC Key EAB用のHMAC秘密鍵(Base64URL形式)
⚠ HMAC Key は秘密情報です。ファイルに保存する場合は chmod 600 で権限を制限してください。

STEP 3ファイアウォールの確認


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

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

STEP 4webroot ディレクトリの設定

Apache の設定確認

sudo cat /etc/apache2/sites-enabled/000-default.conf

sudo cat /etc/httpd/conf.d/vhost.conf

Nginx の設定確認・追記

# /etc/nginx/sites-available/<ドメイン名> の server ブロックに追記
location /.well-known/acme-challenge/ {
    root /var/www/html;
}
sudo nginx -t && sudo systemctl reload nginx

# /etc/nginx/conf.d/<ドメイン名>.conf の server ブロックに追記
location /.well-known/acme-challenge/ {
    root /var/www/html;
}
sudo nginx -t && sudo systemctl reload nginx

チャレンジディレクトリの作成と動作確認
sudo mkdir -p /var/www/html/.well-known/acme-challenge
echo "ok" | sudo tee /var/www/html/.well-known/acme-challenge/test.txt
curl http://<ドメイン名>/.well-known/acme-challenge/test.txt
# "ok" と表示されれば問題なし
sudo rm /var/www/html/.well-known/acme-challenge/test.txt
⚠ 🔴 RedHat系で 403 エラーが出る場合は SELinux が原因の可能性があります。sudo restorecon -Rv /var/www/html/.well-known/ を実行してください。

STEP 5Certbot アカウント登録(EAB付き)

sudo certbot register \
  --server <ACME Server URL> \
  --email <管理者メールアドレス> \
  --eab-kid  "<Key ID>" \
  --eab-hmac-key "<HMAC Key>" \
  --agree-tos \
  --no-eff-email
--dry-runオプションを追加するとテスト出来ます。動作をシミュレーションし、設定は行いません。

STEP 6証明書の取得(初回)

sudo certbot certonly \
  --webroot \
  --webroot-path <ドキュメントルートのフルパス> \
  --server <ACME Server URL> \
  -d <ドメイン名> \
  -d www.<ドメイン名> \
  --email <管理者メールアドレス> \
  --agree-tos \
  --no-eff-email
-dオプション(証明書の発行対象ドメイン名)は、申込時に指定されたドメイン名と、そのwwwサブドメインの両方、またはどちらか一方だけを記述できます。事前にDNSに設定されている必要があります。
--dry-runオプションを追加するとテスト出来ます。動作をシミュレーションし、設定は行いません。

取得成功時、以下の場所に証明書ファイルが作成されます。

/etc/letsencrypt/live/<ドメイン名>/fullchain.pem
サーバ証明書+中間CA証明書
/etc/letsencrypt/live/<ドメイン名>/privkey.pem
秘密鍵
/etc/letsencrypt/live/<ドメイン名>/cert.pem
サーバ証明書のみ
/etc/letsencrypt/live/<ドメイン名>/chain.pem
中間CA証明書のみ

STEP 7Webサーバへの証明書設定

Apache の場合

# /etc/apache2/sites-available/<ドメイン名>-ssl.conf を作成
<VirtualHost *:443>
    ServerName <ドメイン名>
    DocumentRoot /var/www/html
    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/<ドメイン名>/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/<ドメイン名>/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/<ドメイン名>/chain.pem
</VirtualHost>

sudo a2enmod ssl
sudo a2ensite <ドメイン名>-ssl.conf
sudo systemctl reload apache2

# mod_ssl のインストール(未導入の場合)
sudo dnf install -y mod_ssl

# /etc/httpd/conf.d/<ドメイン名>.conf を作成
<VirtualHost *:443>
    ServerName <ドメイン名>
    DocumentRoot /var/www/html
    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/<ドメイン名>/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/<ドメイン名>/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/<ドメイン名>/chain.pem
</VirtualHost>

sudo systemctl reload httpd

Nginx の場合

# /etc/nginx/sites-available/<ドメイン名> を編集
server {
    listen 443 ssl;
    server_name <ドメイン名>;
    ssl_certificate     /etc/letsencrypt/live/<ドメイン名>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<ドメイン名>/privkey.pem;
}
sudo ln -s /etc/nginx/sites-available/<ドメイン名> /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

# /etc/nginx/conf.d/<ドメイン名>-ssl.conf を作成
server {
    listen 443 ssl;
    server_name <ドメイン名>;
    ssl_certificate     /etc/letsencrypt/live/<ドメイン名>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<ドメイン名>/privkey.pem;
}
sudo nginx -t && sudo systemctl reload nginx

STEP 8自動更新の設定

# timer の状態確認
sudo systemctl status snap.certbot.renew.timer

# 更新テスト(dry-run)
sudo certbot renew --dry-run \
  --server <ACME Server URL>

更新後にWebサーバを自動リロードするdeploy hookを設定します。



sudo tee /etc/letsencrypt/renewal-hooks/deploy/reload-apache.sh << 'EOF'
#!/bin/sh
systemctl reload apache2
EOF
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-apache.sh

sudo tee /etc/letsencrypt/renewal-hooks/deploy/reload-httpd.sh << 'EOF'
#!/bin/sh
systemctl reload httpd
EOF
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-httpd.sh

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

動作確認

# 証明書の一覧確認
sudo certbot certificates

# 証明書の内容確認
openssl x509 -in /etc/letsencrypt/live/<ドメイン名>/cert.pem \
  -noout -text | grep -E "Subject:|Issuer:|Not After"

# 次回更新予定の確認
sudo systemctl list-timers snap.certbot.renew.timer

トラブルシューティング

エラー内容 原因 対処法
Connection refused (port 80) ファイアウォールが80番をブロック 🟠 ufw allow 80/tcp
🔴 firewall-cmd --add-service=http
Challenge failed: 404 webroot-path の設定ミス DocumentRoot と --webroot-path が一致するか確認
Challenge failed: 403 SELinux によるアクセス拒否(🔴 RedHat系) restorecon -Rv /var/www/html/.well-known/
EAB credentials error Key ID / HMAC Key が誤り 管理画面で再発行して再登録
Permission denied webroot への書き込み権限不足 sudo を付けて実行
snap: command not found(🔴 RedHat系) snapd のパスが未設定 sudo ln -s /var/lib/snapd/snap /snap 後に再ログイン
詳細なログは /var/log/letsencrypt/letsencrypt.log を参照してください。--verbose オプションで詳細出力が得られます。

ディストリビューション別 主要パス・コマンド早見表

項目 🟠 Debian / Ubuntu 🔴 RedHat系
パッケージ管理 apt dnf
Apache サービス名 apache2 httpd
Apache 設定ディレクトリ /etc/apache2/sites-available/ /etc/httpd/conf.d/
Apache SSL モジュール sudo a2enmod ssl sudo dnf install mod_ssl
Nginx 設定ディレクトリ /etc/nginx/sites-available/ /etc/nginx/conf.d/
ファイアウォール ufw firewalld
SELinux 通常無効 有効(要確認)

ページ上部へ戻る