SSL/TLS · 2 min read · Nov 17, 2025
Debian 9でLet's Encryptをインストールし、NginxをSSL/TLSで保護する
このチュートリアルでは、Debian 9上にNginxウェブサーバーをインストールし、Let’s Encrypt証明書を使用して無料でTLS証明書を発行し、保護する方法を示します。さらに、証明書が期限切れになる前にcronジョブを使用してLet’s Encrypt TLS証明書の自動更新を構成します。
TLS(Transport Layer Security)は、SSL証明書を使用してサーバーとクライアント間、またはNginxサーバーなどのウェブサーバーとブラウザ間で流れるネットワークトラフィックを暗号化するネットワークプロトコルです。これら2つのエンティティ間で交換されるすべてのデータは保護され、接続は中間者攻撃やパケットスニッフィングなどの技術を使用しても復号化できません。certbotパッケージソフトウェアは、Debianで無料のLet’s Encrypt証明書を生成およびダウンロードするプロセスで使用できる、Let’s Encrypt CAが提供する公式クライアントユーティリティです。
要件
- Debian 9にLEMPスタックをインストールします。
- 適切なDNSレコード(Aレコードまたはサブドメイン用のCNAMEレコード)を持つ公開登録ドメイン名。
- サーバーのコンソールへの直接アクセスまたはリモートSSHアクセス。
- ルート権限を持つユーザーアカウントまたはルートアカウントへの直接アクセス。
Certbotクライアントユーティリティのインストール
Debian公式リポジトリからDebian 9にLet’s Encrypt certbotクライアントユーティリティをインストールするには、ターミナルを開き、以下のコマンドをルート権限で実行します。以下のスクリーンショットに示すように。
apt-get install certbot
Debian aptユーティリティは、いくつかの事前チェックの後、certbotパッケージとその必要な依存関係のインストールを続行することに同意するかどうかを尋ねます。ソフトウェアのインストールプロセスを受け入れるには、サーバーのコンソールプロンプトでyes(y)と答えます。
Let’s Encrypt証明書の取得
ドメインのLet’s Encrypt証明書を生成してダウンロードするには、まずNginxウェブサーバーが稼働しており、少なくともポート80がインターネットからアクセス可能であることを確認します。Nginxが実行中かどうかを確認するには、以下のコマンドをルート権限で実行します。
sudo systemctl status nginxサーバーがまだ実行されていない場合は、以下のコマンドでNginxデーモンを起動します。
sudo systemctl start nginxDebianにUFWファイアウォールなどの一般的なファイアウォールがインストールされている場合、ポート80および443のすべての着信接続をブロックしているため、以下のコマンドを実行してHTTPおよびHTTPSポートを開きます。
sudo ufw allow 80/tcpsudo ufw allow 443/tcpドメインの証明書を取得するには、以下のパラメータとフラグを使用してコンソールでcertbotコマンドを実行します。ルート権限でコマンドを実行し、–dフラグを使用して証明書を取得したいドメイン名とすべてのサブドメインを指定します。また、certbotがNginxの設定ファイルに干渉しないように、–standaloneオプションを指定します。このオプションを使用する場合、証明書を発行する際にはNginxサーバーを停止する必要があります。
certbotコマンドの構文は次のとおりです。
sudo certbot certonly --standalone –d yourdomain.com –d www.yourdomain.com最初にcertbotコマンドを実行して証明書を取得すると、メールアドレスを追加し、Let’s Encryptの利用規約に同意するように求められます。サービスの利用規約に同意するには「a」、メールアドレスをLet’s Encryptのパートナーと共有しないには「no」と入力します。最後に、ドメインの証明書を取得した後、フッターのメモを読んで証明書のシステムパスと有効期限を確認します。
Let’s Encrypt SSL証明書を取得する別の方法
「webroot」プラグインを介してLet’s Encrypt証明書を取得するには、以下の構文を使用します。certbotコマンドを–webrootおよび–wフラグを使用して発行する際に、Nginxのウェブルートディレクトリ(デフォルトでは/var/www/html/にあります)を追加します。また、Nginxがウェブルートディレクトリに対して完全な書き込み権限を持っていることを確認し、/.well-knownディレクトリを作成できるようにします。
certbotの–webrootオプションは、証明書の更新およびセキュリティ通知のためにメールアドレスを追加するように求めます。Certbotクライアントには、偽のメールアドレスを検出できる組み込みコードがあります。証明書を取得するには、公開アクセス可能なメールアドレスを提供する必要があります。
certbot certonly --webroot –w /var/www/html/ -d yourdomain.com –d www.yourdomain.com*デバッグログを/var/log/letsencrypt/letsencrypt.logに保存しています**メールアドレスを入力してください(緊急の更新およびセキュリティ通知に使用されます)(キャンセルするには'c'を入力):[email protected] #偽のメールアドレスは検出されます**そのアドレスに問題があるようです**。メールアドレスを入力してください(緊急の更新およびセキュリティ通知に使用されます) 本当にスキップしたい場合は、--register-unsafely-without-emailを使用してクライアントを実行できますが、その場合は次のことを確認してください**アカウントキーを/etc/letsencrypt/accountsからバックアップしてください(キャンセルするには'c'を入力):[email protected]** **-------------------------------------------------------------------------------**サービス利用規約をお読みください**https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf。登録するには同意する必要があります**ACMEサーバーに登録するには**https://acme-v01.api.letsencrypt.org/directory**-------------------------------------------------------------------------------**(A)gree/(C)ancel: a** **-------------------------------------------------------------------------------**あなたのメールアドレスをLet's Encryptプロジェクトの創設パートナーであるElectronic Frontier Foundationと共有することに同意しますか?私たちは、ウェブを暗号化し、そのユーザーを保護し、デジタル権利を守るための作業についてのメールをお送りしたいと考えています。**-------------------------------------------------------------------------------**(Y)es/(N)o: n**新しい証明書を取得しています**次のチャレンジを実行しています:**http-01チャレンジ www.domain.com**すべての一致しないドメインに対してウェブルートパス/var/www/html/を使用しています。**検証を待っています...**チャレンジをクリーンアップしています** **重要な注意事項:* * - おめでとうございます!あなたの証明書とチェーンは次の場所に保存されました** /etc/letsencrypt/live/www.yourdomain.com/fullchain.pem。あなたの** 証明書は2017-12-28に期限切れになります。将来的にこの証明書の新しいバージョンを取得するには、単に再度certbotを実行してください。** すべての証明書を非対話的に更新するには、「certbot renew」を実行してください。** - あなたのアカウント資格情報はCertbotの** 設定ディレクトリに保存されました /etc/letsencrypt。今すぐこのフォルダーの安全なバックアップを作成してください。この設定** ディレクトリには、Certbotによって取得された証明書と秘密鍵も含まれますので、このフォルダーの定期的なバックアップが理想的です。** - Certbotが気に入ったら、次の方法で私たちの作業をサポートすることを検討してください:* * ** ISRG / Let's Encryptへの寄付: https://letsencrypt.org/donate** EFFへの寄付: **https://eff.org/donate-le*
TLS(SSL)のためのNginxの構成
ドメインのためのNginxの完全なデフォルトTLS構成ファイルは、以下のファイル抜粋のようになります。
/etc/nginx/sites-enabled/default-sslファイルサンプル:
* server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name www.yourdomain.com yourdomain.com;
#server_name _;
root /var/www/html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
#SSL証明書
ssl_certificate "/etc/letsencrypt/live/www.yourdomain.com/cert.pem";
ssl_certificate_key "/etc/letsencrypt/live/www. yourdomain.com/privkey.pem";
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000;
#includeSubDomains" always;
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$args $uri/ =404;
}
set $cache_uri $request_uri;
location ~ /.well-known {
allow all;
}
#
# # php-fpm(または他のunixソケット)を使用する場合:
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# # php-cgi(または他のtcpソケット)を使用する場合:
# fastcgi_pass 127.0.0.1:9000;
}
# .htaccessファイルへのアクセスを拒否します。Apacheのドキュメントルートがnginxのものと一致する場合
#
#location ~ \.ht {
# deny all;
#}
}*PHPスクリプトをFastCGIプロセスマネージャーを介して処理するためのコード行もこの抜粋に見られ、以下の行で表されています。
*location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
*NginxにLet’s Encrypt証明書をインストール
Let’s Encrypt証明書とキーは、Debianの/etc/letsencrypt/live/www.yourdomain.com/ディレクトリに保存されます。上記のディレクトリに対してlsコマンドを実行すると、チェーンファイル、フルチェーンファイル、秘密鍵、証明書ファイルなど、すべての証明書コンポーネントが表示されます。
ls /etc/letsencrypt/live/www.yourdomain.com/NginxウェブサーバーのTLS構成ファイルにLet’s Encrypt証明書をインストールするには、Nginxのdefault-sslファイルを開き、以下の行を更新して、ドメインのLet’s Encrypt証明書ファイルパスを反映させます。以下の抜粋に示すように。
nano /etc/nginx/sites-enabled/default-ssl以下の行を次のように変更します。
ssl_certificate "/etc/letsencrypt/live/www.yourdomain.com/cert.pem ";
ssl_certificate_key "/etc/letsencrypt/live/www.yourdomain.com /privkey.pem";**
また、Nginx SSL構成にssl_dhparamステートメントが存在する場合、以下のコマンドを実行して新しい2048ビットのDiffie–Hellmanキーを生成する必要があります。Diffie–Hellmanキーのパラメータ生成には、システムのランダム性やエントロピーに応じて時間がかかる場合があります。
openssl dhparam –out /etc/nginx/dhparam.pem 2048最後に、Nginx TLS構成を有効にする前に、Nginxデーモンを再起動して変更を反映させる前に、Nginxの構成に潜在的な構文エラーがないか確認します。その後、Nginx構成ファイルのテストが成功した場合、以下のコマンドを実行してNginxデーモンを再起動し、新しい構成とLet’s Encrypt証明書を読み込みます。
nginx -tservice nginx restartNginxサービスがポート443でリッスン状態のオープンソケットを所有しているかどうかを確認するには、以下の抜粋に示すようにnetstatコマンドを実行します。
netstat –tulpn | grep -e 443 -e LISTENブラウザを開き、HTTPSプロトコルを介してドメイン名に移動することもできます。NginxにLet’s Encrypt証明書が正常に適用されていれば、SSLハンドシェイクはエラーを出さずにスムーズに動作するはずです。
ウェブトラフィックをHTTPSに強制する
ドメインの訪問者がHTTPSプロトコルを介してのみウェブサイトを閲覧するように強制するには、Nginxのsites-enabledデフォルト構成ファイルを開き、ポート80にヒットするすべてのリクエストをポート443に301ステータスコード(恒久的に移動)でリダイレクトする以下の行を追加します。
nano /etc/nginx/sites-enabled/defaultリダイレクトステートメントは、以下の抜粋のようになります。
*server_name www.yourdomain.com yourdomain.com;
**return 301 https://$server_name$request_uri;*
その後、変更を適用するためにNginxデーモンを再起動します。以下のコマンドを実行します。
service nginx restart最終チェック
Let’s Encrypt CAによって生成された証明書をさらに調査するには、Chromeなどの最新のウェブブラウザを使用できます。Chromeブラウザからドメインを訪問し、F12ファンクションキーを押して開発者ツールを開きます。セキュリティタブに移動し、証明書を表示ボタンをクリックして証明書を開きます。以下のスクリーンショットに示すように。
SSL証明書を調査するためのもう1つの便利なユーティリティは、opensslコマンドラインユーティリティです。Let’s Encrypt CA証明書の追加情報を表示するには、Linuxコンソールで以下のコマンドを実行します。
openssl s_client –connect www.yourdomain.com:443
Let’s Encrypt証明書の自動更新
Let’s Encrypt CAによって発行された証明書を有効期限前に自動的に更新するには、以下のコマンドを実行して、毎日午前2時に実行されるcrontabジョブをスケジュールします。実行されたcronジョブの出力は、/var/log/letsencrypt.logに保存されます。
crontab –e証明書を更新するためのcronジョブ。
**0 2 * * *** certbot renew >> /var/log/letsencrypt.log以上です!Let’s Encrypt証明書とユーティリティに関する他の高度な構成については、次のインターネットアドレスの公式ドキュメントを訪問してください https://certbot.eff.org/docs/。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。