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で確認しておく。