ウェブサイトのセキュリティを無料で強化するなら、Let’s EncryptのSSL証明書をNginxに設定するのが最適解です。この方法でHTTPS化すれば、SEO評価の向上だけでなく、ユーザーの信頼性も高まります。本記事では、実務で使える具体的な手順とトラブルシューティングを、画像付きで丁寧に解説します。初心者でも1時間で完了できる内容です。


目次


Let’s Encrypt SSL証明書設定の準備

Let’s EncryptでSSL証明書を発行する前に、以下の条件を満たしていることを確認してください。

必要な条件

  • ドメイン名の取得:既に独自ドメインを所有していること(例: example.com)
  • DNS設定:ドメインのAレコードがサーバーのIPアドレスに正しく解決されていること
  • Nginxのインストール:WebサーバーとしてNginxが稼働していること
  • ポート開放:サーバーの80番(HTTP)と443番(HTTPS)ポートが開放されていること
  • sudo権限:サーバーにrootまたはsudo権限を持つユーザーでログインできること

これらの条件を満たしていない場合は、先に対応してください。特にDNS設定は、Let’s Encryptの認証プロセスで重要な役割を果たします。

サーバー環境の確認

以下のコマンドでNginxとOSのバージョンを確認します。

# Nginxバージョン確認
nginx -v

OSバージョン確認(Ubuntu/Debianの場合)

lsb_release -a

OSバージョン確認(CentOS/RHELの場合)

cat /etc/redhat-release

Let’s EncryptのCertbotは、主にUbuntu/DebianとCentOS/RHELで動作します。本記事では、Ubuntu 22.04 LTSを前提に解説しますが、他のディストリビューションでも基本的な手順は同じです。

ファイアウォールの設定

サーバーのファイアウォール(ufw)でHTTP/HTTPSポートを開放します。

# ufwの状態確認
sudo ufw status

HTTP(80)とHTTPS(443)を許可

sudo ufw allow 80/tcp sudo ufw allow 443/tcp

ufwを有効化

sudo ufw enable

ファイアウォールが有効になっていない場合は、以下のコマンドで無効化できます(セキュリティ上推奨されません)。

sudo ufw disable

Certbotのインストールと設定

Let’s EncryptのSSL証明書を発行するには、Certbotという公式クライアントツールを使用します。Certbotは、ドメインの所有権を確認するための自動化プロセスを提供しています。

Certbotのインストール

Ubuntu/Debianの場合は、以下のコマンドでCertbotをインストールします。

# 既存のパッケージを更新
sudo apt update
sudo apt upgrade -y

CertbotとNginx用プラグインをインストール

sudo apt install certbot python3-certbot-nginx -y

CentOS/RHELの場合は、EPELリポジトリを有効化してからインストールします。

# EPELリポジトリを有効化
sudo dnf install epel-release -y

Certbotをインストール

sudo dnf install certbot python3-certbot-nginx -y

Certbotの動作確認

Certbotが正しくインストールされたことを確認します。

certbot --version

出力例:certbot 2.6.0

Nginxの設定ファイル確認

Let’s Encryptは、ドメインの所有権を確認するために、一時的なHTTPリクエストを送信します。そのため、Nginxの設定ファイルが正しく設定されている必要があります。

以下のコマンドで、Nginxの設定ファイルが存在するディレクトリに移動します。

cd /etc/nginx/sites-available/

設定ファイルの例(example.com.conf)を以下に示します。

server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

この設定ファイルが存在しない場合は、以下の手順で作成します。

# 設定ファイルを作成
sudo nano /etc/nginx/sites-available/example.com.conf

設定を貼り付け(example.comを自分のドメインに置き換え)

server { listen 80; server_name example.com www.example.com; root /var/www/html; index index.html; location / { try_files $uri $uri/ =404; } }

設定ファイルを有効化

sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/

Nginxを再起動

sudo systemctl restart nginx

設定ファイルを作成したら、Nginxの設定をテストします。

sudo nginx -t

出力例:nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

テストが成功したら、Nginxを再起動します。

sudo systemctl restart nginx

NginxのSSL設定と証明書適用

Certbotを使用して、Let’s EncryptからSSL証明書を発行します。Certbotは、自動的にNginxの設定ファイルを更新して、HTTPSリダイレクトを設定します。

SSL証明書の発行

以下のコマンドで、Certbotを実行してSSL証明書を発行します。

sudo certbot --nginx -d example.com -d www.example.com

このコマンドは、以下の処理を自動で行います。

  1. Let’s Encryptサーバーにドメインの所有権を確認するリクエストを送信
  2. SSL証明書の発行とダウンロード
  3. Nginxの設定ファイルを更新してHTTPSを有効化
  4. HTTPからHTTPSへのリダイレクトを設定

実行中に、以下の質問が表示されます。

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): your-email@example.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N

上記の質問に回答すると、Certbotは自動的にSSL証明書を発行してNginxの設定を更新します。成功すると、以下のメッセージが表示されます。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your cert will expire on 2024-12-31. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Nginxの設定ファイル確認

Certbotが自動で更新したNginxの設定ファイルを確認します。以下のコマンドで、設定ファイルを開きます。

sudo nano /etc/nginx/sites-available/example.com.conf

設定ファイルの例(HTTPS設定が追加されている)を以下に示します。

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_stapling on;
    ssl_stapling_verify on;

    root /var/www/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

この設定ファイルでは、以下の点が重要です。

  • HTTPからHTTPSへのリダイレクト:80番ポートでHTTPリクエストを受け取ると、自動的にHTTPSにリダイレクトされます。
  • SSL証明書のパス:Let’s Encryptが発行した証明書と秘密鍵のパスが指定されています。
  • 暗号スイートの設定:安全な暗号スイートが設定されています。

Nginxの再起動

設定ファイルを更新したら、Nginxを再起動して変更を反映します。

sudo systemctl restart nginx

SSL証明書の有効性確認

SSL証明書が正しく適用されていることを確認します。以下のコマンドで、証明書の詳細を表示します。

sudo openssl x509 -noout -text -in /etc/letsencrypt/live/example.com/fullchain.pem

また、オンラインのSSLチェッカー(例: SSL Labs)を使用して、証明書の有効性を確認することもできます。

ブラウザで自分のウェブサイトにアクセスし、アドレスバーに鍵マーク(🔒)が表示されていれば、SSL証明書が正しく適用されています。


SSL証明書の自動更新設定

Let’s EncryptのSSL証明書は、90日間で有効期限が切れます。そのため、自動更新の設定が必要です。Certbotには、自動更新を行うためのコマンドが用意されています。

自動更新の仕組み

Certbotは、cronジョブを使用して定期的に証明書の有効期限を確認し、必要に応じて更新します。デフォルトでは、30日ごとに自動更新が実行されます。

自動更新のテスト

以下のコマンドで、自動更新が正しく動作するかテストします。

sudo certbot renew --dry-run

このコマンドは、実際に証明書を更新することなく、自動更新プロセスをシミュレーションします。成功すると、以下のメッセージが表示されます。

...
- - - - - - -
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/example.com/fullchain.pem (success)
- - - - - - - -

cronジョブの設定

自動更新を有効にするために、cronジョブを設定します。以下のコマンドで、crontabファイルを開きます。

sudo crontab -e

ファイルの最後に、以下の行を追加します。

0 3 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"

この設定は、毎日午前3時に自動更新を実行し、更新が成功した場合にNginxを再読み込みします。--quietオプションは、ログ出力を抑制します。

cronジョブを保存したら、以下のコマンドでcronサービスを再起動します。

sudo systemctl restart cron

自動更新のログ確認

自動更新が正しく動作していることを確認するために、ログを確認します。

sudo tail -f /var/log/letsencrypt/letsencrypt.log

ログには、自動更新の実行結果が記録されます。例えば、以下のようなメッセージが表示されます。

2024-01-01 03:00:01,000:DEBUG:certbot.renewal:Auto-renewal forced for: example.com
2024-01-01 03:00:01,000:INFO:certbot.renewal:Processing example.com
2024-01-01 03:00:01,000:DEBUG:certbot.plugin:Running post-hook command: systemctl reload nginx

よくあるトラブルと解決策

Let’s EncryptでSSL証明書を設定する際に、以下のようなトラブルが発生することがあります。それぞれの解決策を紹介します。

1. ドメインのDNS設定…

症状:Certbot実行時に「Could not resolve host」や「DNS problem」のエラーが発生する。

解決策

  1. ドメインのDNS設定を確認し、AレコードがサーバーのIPアドレスに正しく解決されていることを確認します。
  2. DNSの変更が反映されるまで待ちます(最大24時間)。
  3. 以下のコマンドでDNSの解決を確認します。
dig example.com +short
nslookup example.com

2. ポート80または44…

症状:Certbot実行時に「Connection refused」や「Timeout」のエラーが発生する。

解決策

  1. ファイアウォール(ufw)やサーバーのセキュリティグループ(AWS EC2など)で、ポート80と443が開放されていることを確認します。
  2. 以下のコマンドでポートの開放状態を確認します。
sudo ufw status
sudo netstat -tulnp | grep nginx

3. Nginxの設定ファ…

症状:Certbot実行後にNginxが起動しない、またはHTTPからHTTPSへのリダイレクトが機能しない。

解決策

  1. Nginxの設定ファイルを確認し、構文エラーがないかチェックします。
  2. 以下のコマンドでNginxの設定をテストします。
sudo nginx -t

エラーが表示された場合は、設定ファイルを修正して再度テストします。

4. SSL証明書の発行に…

症状:Certbot実行時に「Failed authorization procedure」のエラーが発生する。

解決策

  1. Let’s Encryptのレート制限に引っかかっていないか確認します。レート制限については、公式ドキュメントを参照してください。
  2. 一時的に他のサーバーやプロキシ(Cloudflareなど)がDNSを上書きしていないか確認します。
  3. Certbotに--stagingオプションを付けてテスト実行します。
sudo certbot certonly --staging -d example.com -d www.example.com

5. 自動更新が機能しない

症状:cronジョブが実行されても、証明書が更新されない。

解決策

  1. cronジョブのログを確認します。
  2. 以下のコマンドで手動更新を実行します。
sudo certbot renew

更新が成功する場合は、cronジョブの設定に問題がある可能性があります。再度crontabファイルを確認してください。

6. HTTPSにアクセス…

症状:ブラウザでHTTPSにアクセスすると、接続エラーが発生する。

解決策

  1. NginxがHTTPS(443番ポート)をリッスンしていることを確認します。
  2. 以下のコマンドでポートのリッスン状態を確認します。
sudo netstat -tulnp | grep 443

ポート443がリッスンされていない場合は、Nginxの設定ファイルを確認して再起動します。


Let’s EncryptでNginxにSSL証明書を設定する完全ガイド:まとめと次のステップ

本記事では、Let’s Encryptを使用してNginxに無料のSSL証明書を設定する手順を、具体的なコマンドと共に解説しました。以下に、重要なポイントをまとめます。

設定の流れ

  1. 準備:ドメインとサーバーの環境を整えます。
  2. Certbotのインストール:公式クライアントツールをインストールします。
  3. SSL証明書の発行:Certbotを使用して、Let’s Encryptから証明書を発行します。
  4. Nginxの設定更新:HTTPSリダイレクトとSSL設定を反映します。
  5. 自動更新の設定:cronジョブを使用して、証明書を自動更新します。
  6. トラブルシューティング:よくあるエラーとその解決策を紹介します。

セキュリティとパフォーマン…

SSL証明書を設定することで、以下のメリットが得られます。

  • SEO評価の向上:GoogleはHTTPSサイトを優先的に検索結果に表示します。
  • ユーザーの信頼性向上:ブラウザのアドレスバーに鍵マークが表示され、安心感が高まります。
  • データの暗号化:ユーザーとサーバー間の通信が暗号化され、第三者による傍受を防ぎます。
  • 法令遵守:個人情報を扱うサイトでは、HTTPS化が義務付けられています(例: GDPR)。

次のステップ

SSL証明書の設定が完了したら、以下のステップでさらにセキュリティを強化しましょう。

1. HTTP Strict Transport Security (HSTS)の設定

HSTSを設定することで、ブラウザに対して常にHTTPSでアクセスするよう強制できます。以下の設定をNginxに追加します。

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

この設定を追加したら、Nginxを再起動します。

sudo systemctl restart nginx

注意:HSTSを設定すると、HTTPへのリダイレクトが機能しなくなります。設定前に必ずテストしてください。

2. SSL Labsのテスト実施

SSL Labsを使用して、SSL/TLSの設定を包括的にテストします。以下の項目が評価されます。

  • プロトコルと暗号スイートのサポート
  • 証明書の有効性
  • セキュリティヘッダーの設定
  • レート制限と脆弱性の有無

テスト結果に基づいて、必要な設定を見直しましょう。

3. バックアップの実施

SSL証明書とNginxの設定ファイルをバックアップしておきましょう。以下のコマンドでバックアップを作成します。

# SSL証明書のバックアップ
sudo cp -r /etc/letsencrypt /etc/letsencrypt-backup-$(date +%Y%m%d)

Nginxの設定ファイルのバックアップ

sudo cp -r /etc/nginx /etc/nginx-backup-$(date +%Y%m%d)

4. モニタリングの導入

SSL証明書の有効期限が近づくと、自動的に通知されるサービスを導入しましょう。例えば、以下のサービスがあります。

これらのサービスを使用すれば、証明書の有効期限が切れる前に通知を受け取ることができます。

参考リソース

Let’s EncryptとCertbotに関する公式ドキュメントは以下の通りです。

本記事が、あなたのウェブサイトのセキュリティ強化に役立つことを願っています。Let’s Encryptを活用して、安全で信頼性の高いウェブサイトを運営しましょう。


FAQ:Let’s Enc…

Q1. Let’s Enc…

A1. はい、Let’s EncryptのSSL証明書は完全に無料です。発行費用や更新費用は一切かかりません。これは、非営利団体であるISRG(Internet Security Research Group)によって運営されているためです。出典: Let’s Encrypt公式サイト

Q2. SSL証明書の有効…

A2. Let’s EncryptのSSL証明書の有効期限は90日間です。そのため、自動更新の設定が必須となります。Certbotを使用すれば、30日ごとに自動更新が実行されるため、手動での更新は不要です。

Q3. 複数のドメイン(サ…

A3. はい、Certbotを使用すれば、複数のドメインやサブドメインに対してSSL証明書を発行できます。以下のコマンドで発行します。

sudo certbot --nginx -d example.com -d www.example.com -d blog.example.com

このコマンドでは、example.com、www.example.com、blog.example.comの3つのドメインに対してSSL証明書が発行されます。

Q4. SSL証明書の発行…

A4. SSL証明書の発行に失敗する主な原因は以下の通りです。

  • DNS設定が正しくない(AレコードがIPアドレスに解決されていない)
  • ポート80または443が開放されていない
  • Nginxが正しく起動していない
  • Let’s Encryptのレート制限に引っかかっている

これらの原因を確認し、修正した後に再度Certbotを実行してください。レート制限については、公式ドキュメントを参照してください。

Q5. 自動更新が機能しな…

A5. 自動更新が機能しない場合は、以下の手順で確認します。

  1. cronジョブのログを確認します。
  2. 以下のコマンドで手動更新を実行します。
sudo certbot renew --force-renewal

更新が成功する場合は、cronジョブの設定に問題がある可能性があります。再度crontabファイルを確認してください。

Q6. SSL証明書のバッ…

A6. SSL証明書のバックアップは必須ではありませんが、推奨されます。特に、サーバーの再構築や移行を行う際には、バックアップがあれば安心です。以下のコマンドでバックアップを作成します。

sudo cp -r /etc/letsencrypt /etc/letsencrypt-backup-$(date +%Y%m%d)

Q7. Let’s Enc…

A7. はい、Let’s EncryptのSSL証明書は個人サイトだけでなく、企業サイトでも使用できます。ただし、企業サイトの場合は、ドメインの所有権を証明するための追加の手続きが必要な場合があります。詳細は、Let’s Encrypt FAQを参照してください。

Q8. SSL証明書の暗号…

A8. SSL証明書の暗号化強度を強化するには、Nginxの設定ファイルで以下の暗号スイートを使用します。

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA25
【編集・制作ポリシー】
本記事はRoute Bloom編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。
ABOUT ME
たから
サラリーマンをしながら開業して経営やってます。 今年、本業で独立・別事業を起業予定です。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900/FE/サーティファイC言語 ◆サイドビジネス:アパレル事業/複数のWEBメディアを運営