Web サイトに無料 SSL 証明書を導入:Linux の Nginx と Let's Encrypt(Certbot)で HTTPS サイトを公開する方法
公開する Web サイトはすべて HTTPS で配信すべきで、Let's Encrypt の無料 SSL 証明書を使えば簡単に実現できます。このガイドでは、JUSTG のクラウドサーバーや専用サーバーで Nginx を使ってサイトを公開し、certbot で Let's Encrypt 証明書を発行し、自動更新を確認して HTTPS を強制する手順を説明します。コマンドは Debian/Ubuntu と CentOS/Rocky Linux/AlmaLinux の両方を記載しています。例のドメインは example.com、サーバー IP は 203.0.113.10 です。ご自身のものに置き換えてください。
ステップ1:ドメインを JUSTG サーバーに向ける(A/AAAA レコード)
ドメインのレジストラまたは DNS サービスで、ルートドメインと www の A レコードをサーバーの IPv4 に向けます。JUSTG のクラウドサーバーには無料の IPv6 もありますが、AAAA レコードはサーバーで IPv6 を設定し Nginx が待ち受けている場合のみ追加してください。Let's Encrypt はインターネット経由でドメインを検証するため、レコードが反映されてから証明書を申請します。
# A example.com -> 203.0.113.10
# A www.example.com -> 203.0.113.10
# AAAA example.com -> 2001:db8::10 (optional, only if IPv6 is configured)
# check from the server (Debian/Ubuntu: apt install -y dnsutils, Rocky: dnf install -y bind-utils)
dig +short example.com A
dig +short www.example.com A
dig +short example.com AAAAステップ2:Debian/Ubuntu に Nginx と certbot をインストール
certbot の Nginx プラグインは Nginx の設定を自動で書き換えてくれます。標準リポジトリからインストールします。
apt update
apt install -y nginx certbot python3-certbot-nginx
systemctl enable --now nginx
ufw allow 'Nginx Full' # if UFW is enabledステップ3:Rocky Linux/AlmaLinux/CentOS に Nginx と certbot をインストール
RHEL 系では certbot は EPEL リポジトリから提供されます。firewalld で HTTP と HTTPS も開放します。
dnf install -y epel-release
dnf install -y nginx certbot python3-certbot-nginx
systemctl enable --now nginx
firewall-cmd --permanent --add-service=http --add-service=https
firewall-cmd --reloadステップ4:サイトと Nginx の server ブロックを作成
ドキュメントルートとテストページを作成します。SELinux が有効なシステムでは、restorecon で Nginx がファイルを読めるようにします。
mkdir -p /var/www/example.com
echo '<h1>example.com is online</h1>' > /var/www/example.com/index.html
restorecon -Rv /var/www/example.com # Rocky/Alma/CentOS with SELinux only次に、ドメイン用の server ブロックを追加します。
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}ディストリビューションに応じた場所に保存し、構文を確認して Nginx をリロードします。
# Debian / Ubuntu: save as /etc/nginx/sites-available/example.com, then
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
# CentOS / Rocky / AlmaLinux: save as /etc/nginx/conf.d/example.com.conf
nginx -t && systemctl reload nginx
curl -I http://example.comcurl -I が 200 OK を返せば HTTP でアクセスできており、証明書を取得する準備は完了です。
ステップ5:certbot --nginx で Let's Encrypt の無料 SSL 証明書を取得
証明書に含めるすべてのドメイン名を指定して certbot を実行します。初回は期限通知用のメールアドレスと Let's Encrypt 規約への同意を求められます。--redirect を付けると HTTP から HTTPS への自動リダイレクトが追加されます。
certbot --nginx -d example.com -d www.example.com --redirectcertbot は Nginx が配信する一時ファイルでドメインの管理権を確認し、server ブロックに証明書を設定して Nginx をリロードします。
ステップ6:自動更新が動作するか確認
Let's Encrypt の証明書は有効期間が短いため、自動更新が欠かせません。ドライランなら実際の証明書を変えずに更新処理全体をテストできます。
certbot renew --dry-run
# Debian / Ubuntu: the timer is enabled by the package
systemctl list-timers | grep certbot
# Rocky / AlmaLinux (EPEL): enable the renewal timer once
systemctl enable --now certbot-renew.timerドライランが成功し、タイマーが有効になっていれば追加の作業は不要です。
ステップ7:HTTPS を強制して結果を確認
--redirect を付けなかった場合は、certbot が作成した HTTPS ブロックはそのままに、80 番ポートのブロックをリダイレクトに置き換えれば HTTPS を強制できます。
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}Nginx をリロードして確認します。
curl -I http://example.com # expect 301 to https://
curl -I https://example.com # expect 200
certbot certificates別の方法:aaPanel でワンクリック SSL
サーバーで aaPanel を使っている場合は、手動の手順を省略できます。Website でサイトを追加し、サイト設定の SSL セクションで Let's Encrypt を選び、ドメイン名を選択して適用します。最後に Force HTTPS をオンにすれば完了で、更新も aaPanel が自動で行います。ステップ1の DNS レコードは引き続き必要です。
よくある質問
certbot が接続エラーやタイムアウトで失敗します。
A/AAAA レコードがこのサーバーを指しているか、UFW や firewalld で 80 番と 443 番が開いているか、Nginx が起動しているかを確認してください。検証に IPv6 が使われることがあるため、誤った AAAA レコードはよくある原因です。
1 枚の証明書で複数のドメインをカバーできますか?
できます。certbot コマンドに -d を追加してください。すべての名前がこのサーバーに解決される必要があります。
更新後に Nginx を再起動する必要はありますか?
不要です。certbot の Nginx プラグインが更新成功後に自動で Nginx をリロードします。
それでも解決しない場合は、チケットを送信して JUSTG テクニカルサポートにお問い合わせください。