WebサイトのHTTPS化は、セキュリティとSEOの両面で必須の施策です。Let’s EncryptとCertbotを活用すれば、無料で自動的にSSL/TLS証明書を取得・更新できます。この記事では、Nginx環境におけるCertbotの導入から自動更新設定まで、実務で即戦力となる手順を完全解説します。

目次

はじめに:HTTPS化の重要性とLet’s Encryptのメリット

WebサイトのHTTPS化は、2024年現在ではもはや当たり前の施策です。GoogleはHTTPSをSEOランキング要因の一つとしており、検索順位の向上に直結します。また、ユーザーとの通信を暗号化することで、フィッシングやデータ改ざんのリスクを低減できます。

Let’s Encryptは、非営利団体ISRG(Internet Security Research Group)が運営する無料のSSL/TLS証明書発行サービスです。2024年6月現在、全世界で2億件以上の証明書が発行されており(出典: Let’s Encrypt公式統計)、その信頼性は高く評価されています。

Certbotは、Let’s Encryptの証明書を自動的に取得・更新するためのツールです。手動で証明書を更新する手間を省き、運用コストを大幅に削減できます。本記事では、Nginx環境におけるCertbotの導入から自動更新設定まで、実務で即戦力となる手順を完全解説します。

前提条件:Certbot導入に必要な環境

Certbotを利用する前に、以下の条件を満たしていることを確認してください。

1. サーバーOSとバージョン

  • Ubuntu 20.04 LTS / 22.04 LTS
  • Debian 10 / 11 / 12
  • CentOS 7 / 8 / 9
  • Rocky Linux 8 / 9
  • AlmaLinux 8 / 9

※古いOSバージョンではCertbotがサポートされていない場合があります。公式ドキュメントで最新のサポート状況を確認してください。

2. Nginxのインストール

CertbotはNginxだけでなくApacheでも利用できますが、本記事ではNginx環境を前提とします。Nginxがインストールされていない場合は、以下のコマンドでインストールしてください。

Ubuntu/Debianの場合:

sudo apt update
sudo apt install -y nginx

CentOS/Rocky Linux/AlmaLinuxの場合:

sudo dnf install -y epel-release
sudo dnf install -y nginx

3. ドメインの取得とDN…

CertbotでSSL/TLS証明書を発行するには、所有しているドメインが必要です。また、ドメインのDNS設定で、サーバーのIPアドレスにAレコードが正しく設定されていることを確認してください。

4. ポート80と443の開放

CertbotはHTTP-01チャレンジと呼ばれる方法で証明書を発行します。このため、ポート80(HTTP)とポート443(HTTPS)が開放されている必要があります。ファイアウォールの設定を確認してください。

Ubuntu/Debianの場合(ufw):

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

CentOS/Rocky Linux/AlmaLinuxの場合(firewalld):

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

Certbotのインストール手順(Nginx環境)

Certbotのインストール方法は、使用しているOSによって異なります。以下に主要なOSごとの手順を解説します。

1. Ubuntu/Deb…

Ubuntu/Debianでは、Certbotを公式リポジトリからインストールできます。

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

sudo apt update
sudo apt install -y certbot python3-certbot-nginx

インストールが完了したら、以下のコマンドでCertbotのバージョンを確認します。

certbot --version

2. CentOS/Roc…

CentOS系のOSでは、EPELリポジトリを有効化してからCertbotをインストールします。

EPELリポジトリを有効化:

sudo dnf install -y epel-release

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

sudo dnf install -y certbot python3-certbot-nginx

インストールが完了したら、以下のコマンドでCertbotのバージョンを確認します。

certbot --version

3. Dockerを利用す…

Docker環境でCertbotを利用することも可能です。以下のコマンドでCertbotのコンテナを起動できます。

Certbotコンテナを起動:

docker run -it --rm --name certbot \
  -v "/etc/letsencrypt:/etc/letsencrypt" \
  -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
  certbot/certbot certonly --nginx

CertbotでSSL/TLS証明書を発行する

Certbotをインストールしたら、いよいよSSL/TLS証明書を発行します。Nginx環境では、CertbotのNginxプラグインを利用することで、自動的にNginxの設定を更新できます。

1. Certbotを実行する

以下のコマンドを実行して、Certbotで証明書を発行します。example.comは、実際のドメイン名に置き換えてください。

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

このコマンドを実行すると、Certbotは以下の処理を行います。

  • Let’s Encryptの認証局に対して、ドメインの所有権を証明する
  • SSL/TLS証明書を発行する
  • Nginxの設定ファイルを自動的に更新する

実行例:

Certbot実行時の出力例:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for example.com
http-01 challenge for www.example.com
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/example.com
Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/example.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://example.com and
https://www.example.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - -

2. 証明書の発行に成功し…

Certbotが正常に証明書を発行すると、以下のメッセージが表示されます。

Congratulations! You have successfully enabled https://example.com

また、以下のコマンドで発行された証明書を確認できます。

sudo certbot certificates

実行例:

発行された証明書の確認例:

Found the following certs:
  Certificate Name: example.com
    Domains: example.com www.example.com
    Expiry Date: 2024-09-15 12:34:56+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem

3. SSL Labsで証…

発行された証明書が正しく機能しているか、SSL Labsのテストサイトで確認しましょう。

テスト結果で「Certificate is trusted」と表示されていれば、証明書は正しく機能しています。

NginxでHTTPS設定を反映する

Certbotを実行すると、Nginxの設定ファイルが自動的に更新されます。しかし、手動で設定を確認・調整することで、よりセキュアなHTTPS設定が可能になります。

1. Nginxの設定ファ…

Certbotが自動的に作成したNginxの設定ファイルは、以下のパスに保存されています。

/etc/nginx/sites-enabled/example.com

このファイルを開いて、HTTPS設定が正しく反映されているか確認します。

自動生成されたNginx設定例:

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

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

    # その他の設定...
}

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

2. セキュアなHTTPS…

Let’s Encryptの証明書は基本的な暗号化を提供しますが、よりセキュアな設定にするためには、以下のパラメータを追加します。

セキュアなHTTPS設定例:

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

    listen 443 ssl http2;
    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_prefer_server_ciphers on;
    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_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_stapling on;
    ssl_stapling_verify on;

    # HTTP/2を有効化
    http2 on;

    # その他の設定...
}

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

3. Nginx設定を反映する

設定ファイルを更新したら、以下のコマンドでNginxを再起動します。

sudo nginx -t  # 構文チェック
sudo systemctl restart nginx

nginx -tコマンドで構文エラーがないことを確認してから、Nginxを再起動してください。

証明書の自動更新を設定する

Let’s Encryptの証明書は、90日間有効です。このため、自動的に証明書を更新する仕組みを設定することが重要です。Certbotには、自動更新機能が組み込まれています。

1. 自動更新が機能する仕組み

Certbotは、cronジョブまたはsystemdタイマーを利用して、定期的に証明書の更新を確認します。デフォルトでは、Certbotをインストールすると自動更新が有効になります。

以下のコマンドで、自動更新の設定を確認できます。

sudo certbot renew --dry-run

このコマンドを実行すると、Certbotは実際に更新処理を行わずに、更新プロセスが正常に動作するかテストします。

2. 自動更新の設定を確認する

Certbotの自動更新は、以下の場所に設定されています。

  • Ubuntu/Debian: /etc/cron.d/certbot
  • CentOS/Rocky Linux/AlmaLinux: /etc/sysconfig/certbot

以下のコマンドで、自動更新の設定を確認できます。

sudo cat /etc/cron.d/certbot

実行例:

自動更新の設定例(Ubuntu/Debian):

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

0 */12 * * * root /usr/bin/certbot renew --quiet

この設定により、Certbotは1日2回(12時間ごと)証明書の更新を確認します。更新が必要な場合は、自動的に新しい証明書が発行されます。

3. 自動更新が正常に動作…

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

sudo certbot renew --dry-run

このコマンドを実行すると、以下のような出力が表示されます。

テスト実行時の出力例:

Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator nginx, Installer nginx
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for example.com
http-01 challenge for www.example.com
Waiting for verification...
Cleaning up challenges

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed with reload of nginx server; fullchain is
/etc/letsencrypt/live/example.com/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** 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)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - Let's Encrypt

「Congratulations, all renewals succeeded.」と表示されていれば、自動更新は正常に動作します。

Certbot利用時のトラブルと解決策

Certbotを利用する際に発生する可能性のあるトラブルと、その解決策を紹介します。

1. ポート80が開放され…

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

原因:ファイアウォールやルーターの設定で、ポート80(HTTP)がブロックされている可能性があります。

解決策:

  • ファイアウォールの設定を確認し、ポート80を開放します。
  • ルーターのポートフォワーディング設定を確認します。

2. ドメインのDNS設定…

症状:Certbot実行時に「DNS problem: NXDOMAIN looking up A for example.com」エラーが発生する。

原因:ドメインのDNS設定で、Aレコードが正しく設定されていない可能性があります。

解決策:

  • ドメインのDNS設定を確認し、サーバーのIPアドレスにAレコードが正しく設定されていることを確認します。
  • DNSの変更が反映されるまで数分から数時間かかる場合があります。

3. Nginxの設定ファ…

症状:Certbot実行時に「nginx: [emerg] unknown directive “ssl_certificate”」エラーが発生する。

原因:古いバージョンのNginxを使用しているか、SSL/TLS関連のモジュールが有効化されていない可能性があります。

解決策:

  • Nginxのバージョンを確認し、古い場合はアップグレードします。
  • 以下のコマンドでSSL/TLS関連のモジュールが有効化されていることを確認します。
nginx -V 2>&1 | grep -o with-http_ssl_module

出力が「with-http_ssl_module」であれば、SSL/TLSモジュールは有効化されています。

4. 証明書の更新に失敗する

症状:自動更新が正常に動作せず、証明書の更新に失敗する。

原因:ネットワークの問題や、Nginxの設定ファイルにエラーがある可能性があります。

解決策:

  • 以下のコマンドで証明書の更新を手動で実行します。
sudo certbot renew
  • 更新に失敗した場合は、以下のコマンドで詳細なエラーメッセージを確認します。
sudo certbot renew --force-renewal

まとめ:CertbotでHTTPS化を自動化しよう

Let’s EncryptとCertbotを活用すれば、無料でHTTPS化を自動化できます。本記事で解説した手順を実践することで、以下のメリットを得られます。

  • セキュリティの向上:ユーザーとの通信を暗号化し、データの改ざんや盗聴を防止します。
  • SEO効果:GoogleはHTTPSをランキング要因の一つとしており、検索順位の向上が期待できます。
  • 運用コストの削減:証明書の発行・更新を自動化することで、手動作業の手間を省けます。
  • 信頼性の向上:ブラウザのアドレスバーに鍵マークが表示され、ユーザーに安心感を与えます。

Certbotを導入することで、これまで煩雑だったSSL/TLS証明書の管理が劇的に簡単になります。ぜひ本記事の手順を参考に、自分のWebサイトにCertbotを導入してみてください。

最後に、Certbotを利用する際の注意点をまとめます。

  • ドメインの所有権:Certbotで証明書を発行するには、ドメインの所有権を証明する必要があります。
  • ポート80と443の開放:HTTP-01チャレンジを利用するため、ポート80と443を開放しておく必要があります。
  • 自動更新の確認:Certbotは自動更新をサポートしていますが、定期的に動作確認を行いましょう。
  • セキュリティ設定:Let’s Encryptの証明書は基本的な暗号化を提供しますが、よりセキュアな設定にカスタマイズすることをおすすめします。

これらのポイントを押さえて、安全で信頼性の高いWebサイト運用を実現しましょう。

よくある質問(FAQ)

Q1. Let’s Enc…

A1. はい、Let’s Encryptの証明書は完全に無料です。非営利団体ISRGが運営しており、商用利用でも無料で利用できます。ただし、ドメインの所有権を証明する必要があります。

Q2. 証明書の有効期限は…

A2. Let’s Encryptの証明書は、発行日から90日間有効です。このため、自動更新の設定が必須となります。

Q3. 複数のドメインをま…

A3. はい、Certbotを利用すれば、複数のドメインを1つの証明書でカバーできます。例えば、example.comwww.example.comを同時にSSL化できます。

Q4. 自動更新が失敗した…

A4. 自動更新が失敗した場合は、手動で以下のコマンドを実行してください。

sudo certbot renew --force-renewal

また、以下のコマンドで詳細なエラーメッセージを確認できます。

sudo certbot renew --dry-run

Q5. Let’s Enc…

A5. はい、Let’s Encryptの証明書は個人・企業を問わず利用できます。ただし、ドメインの所有権を証明する必要があります。

Q6. Certbot以外…

A6. はい、Certbot以外にも、acme.shや dehydrated などのツールでLet’s Encryptを利用できます。ただし、CertbotはNginxやApacheとの連携が容易なため、多くのユーザーに利用されています。

Q7. 証明書の発行に失敗…

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

  • ポート80が開放されていない
  • ドメインのDNS設定が正しくない
  • Nginxの設定ファイルにエラーがある
  • ファイアウォールやルーターの設定で通信がブロックされている

Q8. Let’s Enc…

A8. いいえ、Let’s Encryptの証明書はDV(Domain Validation)証明書です。このため、企業名や組織名が証明書に表示されることはありません。EV証明書を利用したい場合は、有償の証明書を発行する必要があります。

Q9. Certbotを利…

A9. Certbotを利用する際は、以下のセキュリティ設定に注意してください。

  • Nginxの設定ファイルで、セキュアな暗号スイートを利用する
  • HTTPからHTTPSへのリダイレクトを設定する
  • HSTS(HTTP Strict Transport Security)を有効化する
  • 定期的に証明書の更新を確認する

※セキュリティ設定は自己責任で実施して

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