はじめに
このドキュメントの目的
本ドキュメントは、Nginxウェブサーバー上で無料のSSL/TLS証明書を取得し、HTTPSを有効にする手順をわかりやすく説明します。Certbotという自動化ツールを使って証明書を取得・更新する方法を中心に扱います。
対象読者
- 自分でウェブサイトを公開している方
- サーバー管理の基本操作(コマンド実行や設定ファイル編集)ができる方
難しい前提は不要で、初心者でも順を追えば設定できるように書いています。
本書で扱う内容(章立て)
- はじめに
- Let’s Encrypt・Certbot・SSLの基礎
- Certbotのインストールと初期設定
- ドメイン検証と証明書取得
- Nginxでの手動HTTPS設定
- 自動設定オプション(–nginxプラグイン)
- Nginxの再起動と反映
- 証明書の自動更新メカニズム
- 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チャレンジで検証を行い、検証に成功すると証明書が発行されます。
検証の流れ(簡単な手順)
- Certbotが証明書発行を要求します。
- Let’s Encryptが“チャレンジ”を作成します。通常は短いトークンです。
- Certbotまたはプラグインがそのトークンをwebルートの/.well-known/acme-challenge/に置きます。例: http://example.com/.well-known/acme-challenge/XYZ にトークン文字列を置く。
- Let’s EncryptがそのURLにアクセスしてトークンを確認します。アクセスできればドメイン所有が証明されます。
- 検証成功で証明書(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がインストール済みで、設定ファイルを編集できる権限があること。
設定手順(手順を分かりやすく)
- HTTP(ポート80)で来たアクセスをHTTPSへリダイレクトするserverブロックを作成します。
- HTTPS(ポート443)用のserverブロックに証明書ファイルのパスを指定します。
- 設定を検証して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
手順(簡潔)
- docker-compose.ymlでnginxとcertbotのサービスを定義し、上のボリュームを共有します。Nginxの設定で「location /.well-known/acme-challenge/」を/var/www/certbotに向けます。
- Nginxを起動します。
- 上記コマンドでCertbotを実行し、証明書を取得します。
- 取得後、Nginxを再読み込みして証明書を反映します(docker-compose exec nginx nginx -s reload)。
自動更新
定期的に次コマンドを実行して更新します。
docker-compose run --rm certbot renew --webroot --webroot-path=/var/www/certbot
更新後にNginxを再読み込みするスクリプトを用意すると便利です。












