初心者も安心!ssl・nginx・certbot設定手順を徹底解説ガイド

目次

はじめに

このドキュメントの目的

本ドキュメントは、Nginxウェブサーバー上で無料のSSL/TLS証明書を取得し、HTTPSを有効にする手順をわかりやすく説明します。Certbotという自動化ツールを使って証明書を取得・更新する方法を中心に扱います。

対象読者

  • 自分でウェブサイトを公開している方
  • サーバー管理の基本操作(コマンド実行や設定ファイル編集)ができる方
    難しい前提は不要で、初心者でも順を追えば設定できるように書いています。

本書で扱う内容(章立て)

  1. はじめに
  2. Let’s Encrypt・Certbot・SSLの基礎
  3. Certbotのインストールと初期設定
  4. ドメイン検証と証明書取得
  5. Nginxでの手動HTTPS設定
  6. 自動設定オプション(–nginxプラグイン)
  7. Nginxの再起動と反映
  8. 証明書の自動更新メカニズム
  9. Docker環境での運用

事前準備と注意点

  • 有効なドメイン名と、そのドメインのDNS設定を操作できることが必要です。
  • サーバーにNginxがインストールされていると設定がスムーズです。
  • 証明書は有効期限があるので、自動更新の設定を推奨します。

この章では全体像と進め方を示しました。次章から順に実際の手順を丁寧に説明します。

Let’s Encrypt・Certbot・SSLの基礎知識

Let’s Encryptとは

Let’s Encryptは無料でSSL/TLS証明書を発行する認証局(CA)です。個人や小規模サイトでも費用をかけずにHTTPSにできます。例:example.comに証明書を発行して鍵マークを表示させます。

Certbotとは

CertbotはLet’s Encryptの公式クライアントの一つで、証明書の取得・設定・自動更新を自動化します。コマンド一つで証明書を取得し、Webサーバーに組み込むことができます。

SSL/TLS証明書の基本

証明書は「公開鍵」と「所有者情報」を含み、公開鍵で通信を暗号化し、対応する秘密鍵で復号します。ブラウザは証明書を確認してサイトの正当性を判断します。

証明書チェーンと信頼

発行元(CA)が信頼できるかが重要です。Let’s Encryptは主要ブラウザに信頼されている中間CAと連携します。これによりユーザーのブラウザで鍵マークが表示されます。

なぜHTTPSが必要か

通信の盗聴や改ざんを防ぎ、ログイン情報や個人情報を守ります。SEOやブラウザの機能制限の観点でもHTTPSが推奨されています。

次の章へ

次はCertbotのインストールと初期設定に進みます。

Certbotのインストールと初期設定

概要

Certbotを導入するとNginx用のプラグインが使え、設定を自動化できます。まずはインストールと初期チェックを行います。

インストール手順(例)

  • Ubuntu(apt):
sudo apt update
sudo apt install certbot python3-certbot-nginx
  • 推奨(snapによる最新版):
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

初期設定の前に確認すること

  • ドメインのA/AAAAレコードがサーバーを指していること
  • ファイアウォールで80番と443番が開いていること(例: sudo ufw allow ‘Nginx Full’)

証明書取得の実行例

実行コマンド:

sudo certbot --nginx -d your-domain.com -d www.your-domain.com

実行中は利用規約の同意、メールアドレス入力、HTTP→HTTPSリダイレクトの選択が求められます。リダイレクトを選ぶとCertbotが自動でNginx設定を書き換え、サービスを再起動します。

ファイル場所と更新確認

発行された証明書は /etc/letsencrypt/live/your-domain/ に置かれます。自動更新はcertbotのsystemdタイマーやcronで行われるため、動作確認は次のコマンドでできます。

sudo certbot renew --dry-run
sudo systemctl status certbot.timer

確認方法

  • HTTPSでアクセスできるか: curl -I https://your-domain.com
  • Nginx設定が正しいか: sudo nginx -t

これでCertbotのインストールと初期設定の基本は完了です。

ドメイン検証と証明書取得プロセス

概要

Certbotが実行されると、Let’s Encryptのサーバーと通信してそのドメインの管理権限を確認します。主にHTTP-01チャレンジで検証を行い、検証に成功すると証明書が発行されます。

検証の流れ(簡単な手順)

  1. Certbotが証明書発行を要求します。
  2. Let’s Encryptが“チャレンジ”を作成します。通常は短いトークンです。
  3. Certbotまたはプラグインがそのトークンをwebルートの/.well-known/acme-challenge/に置きます。例: http://example.com/.well-known/acme-challenge/XYZ にトークン文字列を置く。
  4. Let’s EncryptがそのURLにアクセスしてトークンを確認します。アクセスできればドメイン所有が証明されます。
  5. 検証成功で証明書(fullchain.pem)と秘密鍵(privkey.pem)が発行され、/etc/letsencrypt/live/your-domain/ に保存されます。

別の方法と注意点

  • ポート80が使えない場合はDNS-01(TXTレコード)で検証します。ワイルドカード証明書取得にもDNS-01が必要です。
  • 証明書発行後はファイルのパーミッションに注意し、Webサーバーを再起動して新しい証明書を反映します。

例(確認方法)

ブラウザやcurlで http://example.com/.well-known/acme-challenge/トークン を開き、期待する文字列が返るか確認します。

Nginxでの手動HTTPS設定

前提

  • Let’s Encryptで証明書を取得済み(/etc/letsencrypt/live/your-domain.com/ に配置)。
  • Nginxがインストール済みで、設定ファイルを編集できる権限があること。

設定手順(手順を分かりやすく)

  1. HTTP(ポート80)で来たアクセスをHTTPSへリダイレクトするserverブロックを作成します。
  2. HTTPS(ポート443)用のserverブロックに証明書ファイルのパスを指定します。
  3. 設定を検証してNginxを再読み込みします(nginx -t → systemctl reload nginx)。

設定例

server {
    listen 80;
    listen [::]:80;
    server_name your-domain.com www.your-domain.com;
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name your-domain.com www.your-domain.com;
    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

解説・注意点

  • first: 1つ目のブロックでHTTPを恒久的に301リダイレクトすることで、検索エンジンやブラウザがHTTPSを優先します。
  • 証明書のパスは取得先と一致させてください。パスを間違えると起動時にエラーが出ます。
  • ポートやserver_nameを環境に合わせて調整してください。証明書は90日で期限切れになりますので、自動更新設定も検討してください。

自動設定オプション(–nginxプラグイン)

概要

Certbotの–nginxプラグインは、既存のNginx設定を読み取り、必要なSSL設定を自動で追記します。証明書の取得からNginxの再読み込みまでを一括で行うため、手作業を減らせます。

基本的な使い方

コマンド一発で設定を任せられます。

sudo certbot --nginx

実行すると、Certbotがドメインを検出し、対話形式で対象を選びます。選択後に証明書を取得し、Nginxにlistenやssl関連の設定を追加して自動でサービスを再読み込みします。

証明書のみ取得したい場合

設定を自分で行いたいときは、証明書だけを取得します。

sudo certbot certonly --nginx

これで証明書は /etc/letsencrypt/live/<ドメイン>/ に保存されます。自分でserverブロックにssl_certificateやssl_certificate_keyを指定して組み込みます。

よくある注意点

  • Nginxの設定が複雑な場合、正しく解析できないことがあります。手動設定をおすすめする場面です。
  • ポート80/443がファイアウォールで開いている必要があります。
  • 設定変更前に --dry-run で試すと安全です。

実例や問題対応は次章で詳しく説明します。

Nginxの再起動と設定の反映

概要

SSL設定後はNginxを再起動または再読み込みして、新しい設定を反映します。通常はサービスを完全に止めずに設定だけ読み込む「再読み込み(reload)」を使います。

設定確認(必ず実行)

まず設定ファイルに誤りがないか確認します。

sudo nginx -t

問題がなければ次のコマンドで反映します。

再読み込みと再起動の違い

  • 再読み込み: sudo systemctl reload nginx — 現在の接続を維持しつつ設定を反映します。
  • 再起動: sudo systemctl restart nginx — プロセスを止めて起動し直します。短時間の切断が発生します。

通常は reload を使い、設定検証で問題がある場合は restart を検討してください。

主要コマンド例

sudo nginx -t
sudo systemctl reload nginx
sudo systemctl restart nginx
sudo systemctl status nginx
sudo journalctl -u nginx -e

証明書反映の確認方法

  • ブラウザで https://your-domain を開く
  • ポート確認: sudo ss -tlnp | grep :443
  • OpenSSLで確認: openssl s_client -connect your-domain:443 -servername your-domain

よくあるトラブルと対処

  • ポート443が開いていない → ファイアウォール設定を確認
  • 設定ミスで起動できない → nginx -t の出力を確認
  • SELinuxが原因の場合はログを確認

注意点

本番環境ではまずステージングで試し、ダウンタイムを最小に保つよう設定してください。

証明書の自動更新メカニズム

自動更新の基本

Certbotをインストールすると、自動で有効期限をチェックして更新する仕組みが登録されます。多くの環境ではsystemdタイマー(certbot.timer)かcronジョブが使われます。Let’s Encryptの証明書は90日有効ですから、自動更新は必須です。タイマーやcronは定期的に”certbot renew”を実行し、有効期限が近づいた証明書だけを更新します。

動作確認(dry-run)

実際に更新が動くか確認するには次のコマンドを使います。

sudo certbot renew --dry-run

このコマンドは本番環境に影響を与えず模擬更新を行います。成功すれば自動更新が問題なく動く可能性が高いです。

よくあるトラブルと対処

  • ポート80/443が閉じている:Let’s Encryptは検証でHTTP/HTTPSを使います。ファイアウォールを開けてください。
  • Nginxが応答しない:webrootや–nginxプラグインで失敗することがあります。手動でNginxを再起動してから再試行します。
  • 権限やログ:/var/log/letsencrypt/に詳細が残ります。エラーメッセージで原因を確認してください。

日常運用のチェックポイント

  • systemdタイマーの状態確認:
    sudo systemctl status certbot.timer
  • ログ確認:
    sudo tail -n 50 /var/log/letsencrypt/letsencrypt.log

これらを定期的に確認すると、期限切れリスクを減らせます。

Docker環境での運用

概要

Docker環境では、docker-compose.ymlでNginxコンテナがウェブ提供、Certbotコンテナが証明書取得・更新を担当します。Nginxは.acme-challengeをwebrootにルーティングし、Certbotはそのパスを使って検証します。

例(ポイント)

  • ボリューム: /var/www/certbot(検証用ファイル)、/etc/letsencrypt(証明書保存)を共有します。
  • ポート: 80/443をホストに公開します。

docker-composeでの証明書取得例:

docker-compose run --rm certbot certonly --webroot --webroot-path=/var/www/certbot -d example.com -d www.example.com

手順(簡潔)

  1. docker-compose.ymlでnginxとcertbotのサービスを定義し、上のボリュームを共有します。Nginxの設定で「location /.well-known/acme-challenge/」を/var/www/certbotに向けます。
  2. Nginxを起動します。
  3. 上記コマンドでCertbotを実行し、証明書を取得します。
  4. 取得後、Nginxを再読み込みして証明書を反映します(docker-compose exec nginx nginx -s reload)。

自動更新

定期的に次コマンドを実行して更新します。

docker-compose run --rm certbot renew --webroot --webroot-path=/var/www/certbot

更新後にNginxを再読み込みするスクリプトを用意すると便利です。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

目次