Ubuntu22.04でLet'sEncryptを使用してApacheを保護する方法
序章
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レコード。
- サーバーのパブリックIPアドレスを指す
- Ubuntu22.04にApacheをインストールする方法に従ってApacheをインストールします。 ドメインに仮想ホストファイルがあることを確認してください。 このチュートリアルでは、例として
/etc/apache2/sites-available/your_domain.conf
を使用します。
ステップ1—Certbotをインストールする
Let's EncryptでSSL証明書を取得するには、サーバーにCertbotソフトウェアをインストールする必要があります。 そのためにデフォルトのUbuntuパッケージリポジトリを使用します。
まず、ローカルパッケージインデックスを更新します。
sudo apt update
certbot
とpython3-certbot-apache
の2つのパッケージが必要です。 後者はCertbotとApacheを統合するプラグインであり、単一のコマンドで証明書の取得とWebサーバー内のHTTPSの構成を自動化することができます。
sudo apt install certbot python3-certbot-apache
Y
、ENTER
の順に押すと、インストールの確認を求められます。
これで、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 ...
ServerName
とServerAlias
をこのように設定している場合は、テキストエディタを終了して次の手順に進むことができます。 現在の仮想ホスト構成が例と一致しない場合は、それに応じて更新してください。 nano
を使用している場合は、CTRL+X
、Y
、ENTER
の順に押して、変更がある場合はそれを確認して終了できます。 次に、次のコマンドを実行して変更を検証します。
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の使用についてさらに質問がある場合は、それらのドキュメントから始めることをお勧めします。