紹介
Let’s Encryptは、アクセスしやすい方法で無料のTLS/SSL証明書を取得してインストールするための証明機関(CA)であり、これによりウェブサーバー上で暗号化されたHTTPSを可能にします。それは、ほとんど(もしくはすべて)の必要な手順を自動化しようとするソフトウェアクライアントであるCertbotを提供することでプロセスを簡素化します。現在、証明書の取得とインストールの全プロセスが、ApacheとNginxの両方で完全に自動化されています。
このチュートリアルでは、Certbotを使用してRocky Linux 9上のNginx用の無料SSL証明書を取得し、証明書を自動的に更新する方法を説明します。
このチュートリアルでは、デフォルトファイルの代わりに別個のNginxサーバー設定ファイルを使用します。各ドメイン用に新しいNginxサーバーブロックファイルを作成する必要があります。これにより、一般的な間違いを回避し、デフォルトファイルをフォールバック構成として維持できます。
前提条件
このチュートリアルに従うには、次のものが必要です:
-
Rocky Linux 9サーバーをセットアップするには、Rocky Linux 9の初期サーバーセットアップ チュートリアルに従って、sudo権限を持つ非rootユーザーとファイアウォールを含めます。
-
登録済みのドメイン名。このチュートリアルでは、
example.com
を使用します。Namecheapでドメイン名を購入したり、Namecheapで無料で取得したり、選択したドメイン登録業者を使用できます。Freenom -
サーバー用に次のDNSレコードの両方をセットアップしてください。DigitalOceanを使用している場合は、DNSドキュメントを参照して追加方法を確認してください。
example.com
をサーバーの公開IPアドレスにポイントするAレコード。www.example.com
をサーバーの公開IPアドレスにポイントするAレコード。
-
Rocky Linux 9にNginxをインストールする方法に従ってNginxをインストールします。ドメインのためのサーバーブロックがあることを確認してください。このチュートリアルでは、
/etc/nginx/sites-available/example.com
を例にします。
ステップ1 — Certbotのインストール
まず、certbot
ソフトウェアパッケージをインストールする必要があります。非rootユーザーとしてRocky Linux 8マシンにログインしてください:
- ssh sammy@your_server_ip
certbot
パッケージは、デフォルトではパッケージマネージャーを介して利用できません。Certbotをインストールするには、EPELリポジトリを有効にする必要があります。
Rocky Linux 9 EPELリポジトリを追加するには、次のコマンドを実行します:
- sudo dnf install epel-release
インストールを確認されたら、y
と入力してEnterキーを押します。
追加のリポジトリにアクセスできるようになったので、すべての必要なパッケージをインストールします。
- sudo dnf install certbot python3-certbot-nginx
これにより、Certbot自体とCertbotのために必要なNginxプラグインがインストールされます。
インストールプロセスでは、GPGキーのインポートについて確認が求められます。インストールを完了するためには、確認してください。
今、Certbotがインストールされたので、証明書を取得するために実行しましょう。
ステップ2- Nginxの構成の確認
Certbotは、SSLを自動的に構成するために、Nginxの構成で正しいserver
ブロックを見つける必要があります。具体的には、証明書をリクエストするドメインに一致するserver_name
ディレクティブを探します。
Nginxのインストールチュートリアルでサーバーブロックの設定手順に従った場合、すでに適切に設定されたserver_name
ディレクティブを使用して、ドメインのためのサーバーブロックが/etc/nginx/conf.d/example.com
に存在するはずです。
確認するために、お好きなテキストエディタでドメインの設定ファイルを開いてください(例:nano)。
- sudo nano /etc/nginx/conf.d/example.com
既存のserver_name
行を見つけます。次のように表示されるはずです:
...
server_name example.com www.example.com;
...
表示される場合は、エディタを終了し、次のステップに進んでください。
表示されない場合は、一致するように更新してください。その後、ファイルを保存し、エディタを終了し、構成の構文を確認します:
- sudo nginx -t
エラーが発生した場合は、サーバーブロックファイルを再度開き、タイプミスや欠落している文字を確認してください。構成ファイルの構文が正しい場合は、新しい構成を読み込むためにNginxをリロードします。
- sudo systemctl reload nginx
Certbotは正しいserver
ブロックを自動的に検出して更新できます。
次に、ファイアウォールの設定を更新してHTTPSトラフィックを許可しましょう。
ステップ3 – ファイアウォールルールの更新
前提条件のセットアップにより、firewalld
が有効になっているため、Nginxウェブサーバーでの外部接続を許可するためにファイアウォールの設定を調整する必要があります。
既に有効になっているサービスを確認するには、次のコマンドを実行します:
- sudo firewall-cmd --permanent --list-all
次のような出力が表示されます:
Outputpublic
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client http ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
サービスのリストにhttp
が表示されない場合は、次のコマンドを実行して有効にします:
- sudo firewall-cmd --permanent --add-service=http
https
トラフィックを許可するには、次のコマンドを実行します:
- sudo firewall-cmd --permanent --add-service=https
変更を適用するには、ファイアウォールサービスをリロードする必要があります:
- sudo firewall-cmd --reload
httpsトラフィックをサーバーに開放したので、Certbotを実行して証明書を取得する準備が整いました。
ステップ4 – SSL証明書の取得
Certbotは、プラグインを介してさまざまな方法でSSL証明書を取得することができます。Nginxプラグインは、必要な場合にNginxの再設定と設定のリロードを管理します。このプラグインを使用するには、次のように入力します:
- sudo certbot --nginx -d example.com -d www.example.com
これにより、certbot
が--nginx
プラグインを使用して実行され、-d
を使用して証明書の有効である必要があるドメイン名を指定します。
コマンドを実行する際には、メールアドレスを入力し、利用規約に同意するように求められます。これを行った後、処理が成功したことと証明書の保存場所が表示されます:
OutputSuccessfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem
Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem
This certificate expires on 2022-12-15.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for your_domain to /etc/nginx/conf.d/your_domain.conf
Successfully deployed certificate for www.your_domain to /etc/nginx/conf.d/your_domain.conf
Congratulations! You have successfully enabled HTTPS on https://your_domain and https://www.your_domain
…
証明書がダウンロード、インストール、ロードされ、Nginxの設定が自動的にすべてのWebリクエストをhttps://
にリダイレクトします。ウェブサイトをリロードして、ブラウザのセキュリティインジケータを確認してください。通常、ロックアイコンが表示され、サイトが正しく保護されていることを示します。 SSL Labs Server Testを使用してサーバーをテストすると、Aの評価を受けるはずです。
最後に、更新プロセスをテストして終了しましょう。
ステップ5 – Certbotの自動更新の検証
Let’s Encrypt 証明書の有効期間は90日間ですが、証明書を更新する際は、エラーの余裕を考慮して60日ごとが推奨されています。Certbot Let’s Encryptクライアントには、renew
コマンドがあり、現在インストールされている証明書を自動的に確認し、有効期限が30日未満の場合にそれらを更新しようとします。
このコマンドを実行して証明書の自動更新をテストできます:
- sudo certbot renew --dry-run
出力は次のようになります:
OutputSaving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/your_domain.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 monitoring.pp.ua
Waiting for verification...
Cleaning up challenges
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed with reload of nginx server; fullchain is
/etc/letsencrypt/live/your_domain/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/your_domain/fullchain.pem (success)
...
複数のドメインを含むバンドルされた証明書を作成した場合、出力には基本ドメインのみが表示されますが、更新はこの証明書に含まれるすべてのドメインに対して機能します。
A practical way to ensure your certificates will not get outdated is to create a cron
job that will periodically execute the automatic renewal command for you. Since the renewal first checks for the expiration date and only executes the renewal if the certificate is less than 30 days away from expiration, it is safe to create a cron job that runs every week, or even every day.
クロンタブを編集して、1日に2回更新を実行する新しいジョブを作成します。rootユーザーのクロンタブを編集するには、次のコマンドを実行します:
- sudo crontab -e
テキストエディタが開かれ、これはこの時点で空のテキストファイルです。挿入モードに入るにはi
を押し、次の行を追加します:
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew --quiet
終了したら、挿入モードを終了するにはESC
を押し、:wq
と入力してファイルを保存し終了します。Viおよびその後継であるVimテキストエディタについて詳しく学びたい場合は、当社のクラウドサーバー上でのVimテキストエディタのインストールと使用のチュートリアルを参照してください。
これにより、毎日正午と深夜に実行される新しいクロンジョブが作成されます。python -c 'import random; import time; time.sleep(random.random() * 3600)'
は、更新タスクのために1時間内のランダムな分を選択します。
renew
コマンドは、システムにインストールされているすべての証明書をチェックし、30日未満で期限切れになるものを更新します。 --quiet
は、Certbotが情報を出力せず、ユーザーの入力を待たないように指示します。
更新に関する詳細な情報は、Certbotのドキュメントで見つけることができます。
結論
このガイドでは、Let’s EncryptクライアントCertbotをインストールし、ドメインのSSL証明書をダウンロードし、自動証明書更新を設定しました。Certbotの使用に関する質問がある場合は、公式のCertbotドキュメントを参照してください。
また、重要な更新情報は定期的に公式のLet’s Encryptブログで確認できます。