Ubuntu22.04でLet'sEncryptを使用してApacheを保護する方法

提供:Dev Guides
移動先:案内検索

序章

Let's Encryptは、無料の TLS / SSL証明書の取得とインストールを容易にする認証局(CA)であり、これによりWebサーバーで暗号化されたHTTPSを有効にします。 必要な手順のほとんど(すべてではないにしても)を自動化しようとするソフトウェアクライアントCertbotを提供することにより、プロセスを合理化します。 現在、証明書の取得とインストールのプロセス全体は、ApacheとNginxの両方で完全に自動化されています。

このガイドでは、 Certbot を使用してUbuntu22.04でApacheの無料SSL証明書を取得し、この証明書が自動的に更新されるように設定されていることを確認します。

このチュートリアルでは、Let's Encryptによって保護されるWebサイトをセットアップするために、Apacheのデフォルトの構成ファイルの代わりに別の仮想ホストファイルを使用します。 サーバーでホストされているドメインごとに新しいApache仮想ホストファイルを作成することをお勧めします。これは、よくある間違いを回避し、フォールバックセットアップとしてデフォルトの構成ファイルを維持するのに役立ちます。

前提条件

このチュートリアルに従うには、次のものが必要です。

  • sudo管理者権限とファイアウォールが有効になっているroot以外のユーザーでセットアップされた1台のUbuntu22.04サーバー。 これを設定するには、Ubuntu22.04チュートリアルの初期サーバー設定に従います。
  • 完全に登録されたドメイン名。 このチュートリアルでは、全体を通して例としてyour_domainを使用します。 Namecheap でドメイン名を購入するか、 Freenom で無料でドメイン名を取得するか、選択したドメイン登録事業者を使用できます。
  • 次の両方のDNSレコードがサーバー用に設定されています。 それらを追加する方法の詳細については、このDigitalOceanDNSの紹介に従ってください。
    • サーバーのパブリックIPアドレスを指すyour_domainのAレコード。
    • サーバーのパブリックIPアドレスを指すwww.your_domainのAレコード。
  • Ubuntu22.04にApacheをインストールする方法に従ってApacheをインストールします。 ドメインに仮想ホストファイルがあることを確認してください。 このチュートリアルでは、例として/etc/apache2/sites-available/your_domain.confを使用します。

ステップ1—Certbotをインストールする

Let's EncryptでSSL証明書を取得するには、サーバーにCertbotソフトウェアをインストールする必要があります。 そのためにデフォルトのUbuntuパッケージリポジトリを使用します。

まず、ローカルパッケージインデックスを更新します。

sudo apt update

certbotpython3-certbot-apacheの2つのパッケージが必要です。 後者はCertbotとApacheを統合するプラグインであり、単一のコマンドで証明書の取得とWebサーバー内のHTTPSの構成を自動化することができます。

sudo apt install certbot python3-certbot-apache

YENTERの順に押すと、インストールの確認を求められます。

これで、Certbotがサーバーにインストールされました。 次のステップでは、Apacheの構成を検証して、仮想ホストが適切に設定されていることを確認します。 これにより、certbotクライアントスクリプトがドメインを検出し、新しく生成されたSSL証明書を自動的に使用するようにWebサーバーを再構成できるようになります。

ステップ2—Apache仮想ホスト構成を確認する

WebサーバーのSSLを自動的に取得して構成するには、CertbotはApache構成ファイル内で正しい仮想ホストを見つける必要があります。 サーバードメイン名は、VirtualHost構成ブロック内で定義されたServerNameおよびServerAliasディレクティブから取得されます。

Apacheインストールチュートリアル仮想ホストのセットアップ手順に従った場合は、/etc/apache2/sites-available/your_domain.confのドメインにServerNameを使用してVirtualHostブロックをセットアップする必要があります。 X194X]ディレクティブはすでに適切に設定されています。

これが設定されていることを確認するには、nanoまたはお好みのテキストエディタを使用して、ドメインの仮想ホストファイルを開きます。

sudo nano /etc/apache2/sites-available/your_domain.conf

既存のServerNameおよびServerAlias行を検索します。 それらは次のようにリストされている必要があります。

/etc/apache2/sites-available/your_domain.conf

...
ServerName your_domain
ServerAlias www.your_domain
...

ServerNameServerAliasをこのように設定している場合は、テキストエディタを終了して次の手順に進むことができます。 現在の仮想ホスト構成が例と一致しない場合は、それに応じて更新してください。 nanoを使用している場合は、CTRL+XYENTERの順に押して、変更がある場合はそれを確認して終了できます。 次に、次のコマンドを実行して変更を検証します。

sudo apache2ctl configtest

応答としてSyntax OKを受け取るはずです。 エラーが発生した場合は、仮想ホストファイルを再度開き、タイプミスや文字の欠落がないか確認してください。 構成ファイルの構文が正しい場合は、Apacheをリロードして、変更を有効にします。

sudo systemctl reload apache2

これらの変更により、Certbotは正しいVirtualHostブロックを見つけて更新できるようになります。

次に、HTTPSトラフィックを許可するようにファイアウォールを更新します。

ステップ3—ファイアウォールを介したHTTPSの許可

前提条件ガイドで推奨されているように、UFWファイアウォールを有効にしている場合は、HTTPSトラフィックを許可するように設定を調整する必要があります。 インストール時に、Apacheはいくつかの異なるUFWアプリケーションプロファイルを登録します。 Apache Full プロファイルを利用して、サーバーでHTTPトラフィックとHTTPSトラフィックの両方を許可できます。

サーバーで現在許可されているトラフィックの種類を確認するには、ステータスを確認します。

sudo ufw status

Apacheインストールガイドのいずれかに従うと、次のような出力が得られます。つまり、ポート80でのHTTPトラフィックのみが現在許可されています。

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Apache                     ALLOW       Anywhere             
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Apache (v6)                ALLOW       Anywhere (v6)

HTTPSトラフィックを許可するには、「ApacheFull」プロファイルを許可します。

sudo ufw allow 'Apache Full'

次に、冗長な「Apache」プロファイルを削除します。

sudo ufw delete allow 'Apache'

ステータスは次のように表示されます。

sudo ufw status
OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Apache Full                ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Apache Full (v6)           ALLOW       Anywhere (v6)        

これで、Certbotを実行して証明書を取得する準備が整いました。

ステップ4—SSL証明書を取得する

Certbotは、プラグインを介してSSL証明書を取得するためのさまざまな方法を提供します。 Apacheプラグインは、Apacheの再構成と、必要に応じて構成の再ロードを処理します。 このプラグインを使用するには、次を実行します。

sudo certbot --apache

このスクリプトは、SSL証明書を構成するために一連の質問に答えるように促します。 まず、有効なメールアドレスを尋ねられます。 この電子メールは、更新通知とセキュリティ通知に使用されます。

OutputSaving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): you@your_domain

有効なメールアドレスを入力したら、ENTERを押して次の手順に進みます。 次に、Let'sEncryptの利用規約に同意するかどうかを確認するよう求められます。 Yを押してからENTERを押すと確認できます。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

次に、ニュースやその他の情報を受け取るために、電子メールを電子フロンティア財団と共有するかどうかを尋ねられます。 それらのコンテンツを購読したくない場合は、Nと書いてください。 それ以外の場合は、Yと入力し、ENTERを押して次の手順に進みます。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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

次の手順では、HTTPSをアクティブ化するドメインをCertbotに通知するように求められます。 リストされたドメイン名はApache仮想ホスト構成から自動的に取得されるため、仮想ホストで正しいServerNameおよびServerAlias設定が構成されていることを確認することが重要です。 リストされているすべてのドメイン名に対してHTTPSを有効にする場合(推奨)、プロンプトを空白のままにして、ENTERを押して続行できます。 それ以外の場合は、コンマやスペースで区切って適切な番号をそれぞれリストすることにより、HTTPSを有効にするドメインを選択し、ENTERを押します。

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: your_domain
2: www.your_domain
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 

この手順の後、Certbotの構成が完了し、新しい証明書と生成されたファイルの場所に関する最終的なコメントが表示されます。

[secondary_label]
Successfully 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-07-10.
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/apache2/sites-available/your_domain-le-ssl.conf
Successfully deployed certificate for www.your_domain.com to /etc/apache2/sites-available/your_domain-le-ssl.conf
Congratulations! You have successfully enabled HTTPS on https:/your_domain and https://www.your_domain.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

これで、証明書がインストールされ、Apacheの構成にロードされます。 https://を使用してウェブサイトをリロードしてみて、ブラウザのセキュリティインジケータに注目してください。 通常、アドレスバーのロックアイコンによって、サイトが適切に保護されていることを示す必要があります。

SSL Labsサーバーテストを使用して、証明書のグレードを確認し、外部サービスの観点から証明書に関する詳細情報を取得できます。

次の最後のステップでは、Certbotの自動更新機能をテストします。これにより、有効期限が切れる前に証明書が自動的に更新されることが保証されます。

ステップ5—Certbotの自動更新を確認する

Let's Encryptの証明書は、90日間のみ有効です。 これは、ユーザーが証明書の更新プロセスを自動化することを奨励するとともに、誤用された証明書や盗まれたキーが後でではなく早く期限切れになるようにするためです。

インストールしたcertbotパッケージは、certbot.timerと呼ばれるsystemctlサービスによって管理される/etc/cron.dへの更新スクリプトを含めることによって更新を処理します。 このスクリプトは1日2回実行され、有効期限が切れてから30日以内の証明書は自動的に更新されます。

このサービスのステータスをチェックし、アクティブであることを確認するには、次のコマンドを実行します。

sudo systemctl status certbot.timer

出力は次のようになります。

Output● certbot.timer - Run certbot twice daily
     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset:>
     Active: active (waiting) since Mon 2022-04-11 20:52:46 UTC; 4min 3s ago
    Trigger: Tue 2022-04-12 00:56:55 UTC; 4h 0min left
   Triggers: ● certbot.service

Apr 11 20:52:46 jammy-encrypt systemd[1]: Started Run certbot twice daily.

更新プロセスをテストするには、certbotを使用してドライランを実行できます。

sudo certbot renew --dry-run
OutputSaving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/your_domain.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Account registered.
Simulating renewal of an existing certificate for your_domain and www.your_domain.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/your_domain/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

エラーが発生しなければ、準備は完了です。 必要に応じて、Certbotは証明書を更新し、Apacheをリロードして変更を取得します。 自動更新プロセスが失敗した場合、Let's Encryptは指定した電子メールにメッセージを送信し、証明書の有効期限が近づくと警告を発します。

結論

このチュートリアルでは、Let'sEncryptクライアントcertbotをインストールし、ドメインのSSL証明書を構成してインストールし、Certbotの自動更新サービスがsystemctl内でアクティブであることを確認しました。 Certbotの使用についてさらに質問がある場合は、それらのドキュメントから始めることをお勧めします。