2026年8月16日

2026年8月16日

certbotでNginxにSSL証明書を設定する方法|自動設定・リダイレクト・更新の確認

certbot の Nginx プラグイン(--nginx)を使うと、Let's Encrypt の証明書の取得から Nginx の設定の書き換え、Nginx の再読み込みまでを1つのコマンドで行えます。更新後の再読み込みも certbot が行います。

この記事では、Linux サーバーの Nginx に certbot で証明書を設定する手順を説明します。内容は certbot 公式サイト(certbot.eff.org)とユーザーガイド、nginx.org のドキュメントで2026年10月時点の内容を確認しています。Let's Encrypt のドメイン確認の仕組み、レート制限、有効期間の短縮予定はLet's EncryptのSSL証明書をcertbotで取得する方法で説明しています。

始める前に確認すること

  • ドメインの DNS(A レコード・AAAA レコード)がこのサーバーを向いていること。
  • 外部からポート80に接続できること。--nginx は HTTP-01 という方式で、ポート80経由でドメインの所有を確認します。HTTPS 用にポート443も開けておきます。
  • 対象ドメインを server_name に書いたサーバーブロックがあり、sudo nginx -t がエラーなく通ること。certbot はこの server_name を手がかりに、書き換えるサーバーブロックを探します。

手順1: certbot と Nginx プラグインをインストールする

certbot 公式サイトは snap でのインストールを案内しています。snap 版には Nginx プラグインも含まれます。

# OSのパッケージで入れたcertbotがあれば先に削除する(Debian / Ubuntu の例)
sudo apt-get remove certbot

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/local/bin/certbot

ディストリビューションのパッケージで入れる場合は、certbot 本体と Nginx プラグインのパッケージを入れます。

# Debian / Ubuntu
sudo apt update
sudo apt install certbot python3-certbot-nginx

# RHEL / AlmaLinux / Rocky Linux(EPELリポジトリを使う)
sudo dnf install epel-release
sudo dnf install certbot python3-certbot-nginx

RHEL 9 系では、epel-release を入れる前に CodeReady Builder(CRB)リポジトリの有効化を求められることがあります。CentOS 7 向けの yum install python2-certbot-nginx という手順は、CentOS 7 のサポート終了とともに使えなくなっています。

手順2: サーバーブロックを用意する

HTTP(ポート80)で動くサーバーブロックを先に作っておきます。最小の例です。

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    root /var/www/example;
    index index.html index.php;
}

置き場所はディストリビューションで異なります。

OS 設定ファイルの置き場所
Debian / Ubuntu /etc/nginx/sites-available/example.com に書き、/etc/nginx/sites-enabled/ にシンボリックリンクを作る
RHEL 系・nginx.org の公式パッケージ /etc/nginx/conf.d/example.com.conf(拡張子は .conf)
# Debian / Ubuntu で有効にする
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

# 構文を確認して再読み込みする
sudo nginx -t
sudo systemctl reload nginx

サーバーブロックの書き方はNginxのserver blockの書き方と設定手順を参照してください。

手順3: certbot --nginx で証明書を取得・設定する

sudo certbot --nginx -d example.com -d www.example.com

-d には、証明書に入れるドメインをすべて指定します。初回は連絡用メールアドレスの入力と利用規約への同意を求められます。certbot は確認用のファイルを一時的に Nginx で公開してドメインを確認し、証明書を取得したあと、Nginx の設定を書き換えて再読み込みします。

質問に答えずに実行したい場合(構築スクリプトなど)は、次のオプションを付けます。

sudo certbot --nginx --non-interactive --agree-tos -m admin@example.com \
  -d example.com -d www.example.com
オプション 意味
--non-interactive 質問を出さずに実行する
--agree-tos 利用規約に同意する
-m 連絡用メールアドレス
--no-eff-email EFF からのお知らせメールの登録を断る
--no-redirect HTTP から HTTPS へのリダイレクトを設定しない

現在の certbot は、--nginx で証明書を設定するとき、HTTP から HTTPS へのリダイレクトも既定で設定します。リダイレクトを自分で書きたい場合は --no-redirect を付けます。

Nginx の設定は自分で書く場合(certonly)

Nginx の設定ファイルを certbot に書き換えさせたくない場合は、certonly で証明書だけを取得します。ドメインの確認には Nginx プラグインが使われ、設定ファイルは変わりません。

sudo certbot certonly --nginx -d example.com -d www.example.com

このときは、手順4の例のように ssl_certificate と ssl_certificate_key を自分で書きます。

手順4: certbot が書き加える設定を確認する

certbot は、対象のサーバーブロックに HTTPS 用の設定を加え、末尾に # managed by Certbot と付けます。手順2のサーバーブロックは、おおむね次のようになります(元の設定によって細部は異なります)。

server {
    server_name example.com www.example.com;

    root /var/www/example;
    index index.html index.php;

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = www.example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    if ($host = example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 404; # managed by Certbot
}
項目 内容
ssl_certificate サーバー証明書と中間証明書をまとめた fullchain.pem
ssl_certificate_key 秘密鍵 privkey.pem
options-ssl-nginx.conf certbot が用意する TLS の推奨設定(プロトコル、暗号スイート、セッションの設定)
ssl-dhparams.pem certbot が用意する DH パラメーター
ポート80のサーバーブロック 対象のホスト名へのアクセスを HTTPS へ301でリダイレクトする

証明書は更新のたびに /etc/letsencrypt/live/ドメイン名/ の中身が新しくなるため、ファイルをコピーせず、このパスを直接指定したままにします。

HTTP/2 を使う場合、Nginx 1.25.1 以降では 443 のサーバーブロックに http2 on; を加えます。詳しくはNginxでHTTP/2を有効にする方法を参照してください。TLS の設定をさらに見直す場合はNginxでSSLの設定を強化する方法も参考になります。設定を変えたら、sudo nginx -t で確認してから再読み込みします。

手順5: HTTPS で表示されるか確認する

# 設定の構文を確認する
sudo nginx -t

# HTTPSで応答するか(200などが返ればよい)
curl -I https://example.com/

# HTTPからHTTPSへ301でリダイレクトされるか
curl -I http://example.com/

# 配信されている証明書の対象と有効期限を確認する
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null \
  | openssl x509 -noout -subject -dates

# certbotが管理している証明書の一覧
sudo certbot certificates

WordPress を動かしている場合は、HTTPS に切り替えたあとで「設定」→「一般」の「WordPress アドレス (URL)」と「サイトアドレス (URL)」を https:// に変えます。

自動更新を確認する

Let's Encrypt の証明書の有効期間は、2026年10月時点で90日です。certbot のパッケージには certbot renew を定期的に実行する systemd タイマーか cron の設定が含まれていて、期限が近い証明書を自動で更新します。--nginx で設定した証明書は、更新後の Nginx の再読み込みも certbot が行います。

# 更新のタイマーがあるか確認する
systemctl list-timers | grep certbot

# 本番の証明書を変えずに、更新の手順を試す
sudo certbot renew --dry-run

--dry-run がエラーなく終われば、自動更新も同じ手順で動きます。Let's Encrypt は有効期限切れを知らせるメールを2025年6月に終了しているため、更新が止まっていないかは certbot certificates や外部の監視で確認します。監視の方法はWordPressサイトのSSL証明書の有効期限を自動監視してアラートを出す方法で説明しています。

うまくいかないとき

まずログを確認します。

sudo tail -n 100 /var/log/letsencrypt/letsencrypt.log
症状 主な原因と対処
Could not automatically find a matching server block と表示される -d で指定したドメインを server_name に書いたサーバーブロックが無い。手順2のとおり作り、nginx -t を通してから再実行する
ドメインの確認に失敗する(Timeout、Connection refused など) DNS がまだこのサーバーを向いていない、ポート80がファイアウォールやセキュリティグループで閉じている
ドメインの確認で 404 などが返る 別のサーバーブロック(default_server など)が応答している、DNS が古いサーバーを向いている
nginx -t がエラーになり certbot が止まる 既存の設定に誤りがある。エラーの行を直してから再実行する
HTTPS で古い証明書や別のサイトの証明書が表示される Nginx を再読み込みしていない、同じ server_name のサーバーブロックが重複している

試行を繰り返すときは、本番の発行上限を消費しないよう --dry-run や --test-cert を使います。

まとめ

  • server_name を書いたポート80のサーバーブロックを用意し、sudo certbot --nginx -d ドメイン を実行すると、証明書の取得と Nginx の HTTPS 設定、HTTP からのリダイレクトまで行われる。
  • 設定を自分で書く場合は certbot certonly --nginx で証明書だけを取得し、fullchain.pem と privkey.pem のパスを指定する。
  • 自動更新はパッケージに含まれるタイマーで動き、Nginx の再読み込みも certbot が行う。certbot renew --dry-run で確認しておく。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲