CentOS8でLet'sEncryptを使用してApacheを保護する方法
序章
Let's Encryptは、無料の TLS / SSL証明書の取得とインストールを容易にする認証局(CA)であり、これによりWebサーバーで暗号化されたHTTPSを有効にします。 Certbot などのクライアントと連携してプロセスを簡素化し、必要な手順を自動化します。
このチュートリアルでは、Certbotを使用して、CentOS8上のApacheWebサーバーでTLS/SSL証明書を設定します。 さらに、cronジョブを使用して証明書の更新プロセスを自動化します。これについては、Cronを使用してCentOS8でタスクを自動化する方法を参照してください。
前提条件
このガイドを完了するには、次のものが必要です。
- root以外のsudo対応ユーザーと基本的な
firewalld
ファイアウォールを備えた1台のCentOS8サーバーは、CentOS8初期サーバーセットアップガイドに従ってセットアップされます。 - ドメイン用に構成された仮想ホストを使用してサーバーにインストールされたApache。 これを設定する方法については、チュートリアル CentOS8にApacheWebサーバーをインストールする方法を参照してください。 ドメインに仮想ホストが設定されていることを確認してください。 このチュートリアルでは、例として
/etc/httpd/sites-available/example.com.conf
を使用します。 - 証明書を使用する登録済みドメイン名を所有または管理する必要があります。 ドメイン名をまだ登録していない場合は、 Namecheap で購入するか、 Freenom で無料で入手するか、選択したドメイン登録事業者を使用できます。
- ドメインがサーバーのパブリックIPアドレスを指すDNSARecord。 DigitalOceanを介してドメインをホストしている場合、DigitalOceanプラットフォームでこれらのレコードを追加する方法の詳細については、DigitalOceanDNSドキュメントを参照してください。 証明書を発行するドメインを所有していることをLet'sEncryptが検証する方法のため、DNS
A
レコードが必要です。 たとえば、example.com
の証明書を取得する場合、検証プロセスを機能させるには、そのドメインをサーバーに解決する必要があります。 この設定では、ドメイン名としてexample.com
とwww.example.com
を使用します。どちらも、有効なDNSレコードが必要です。
これらの前提条件をすべて完了したら、Certbotクライアントソフトウェアのインストールに進みます。
ステップ1— CertbotLet'sEncryptクライアントのインストール
Let's Encryptを使用してSSL証明書を取得するには、最初にCertbotと mod_ssl 、SSLv3暗号化のサポートを提供するApacheモジュールをインストールする必要があります。
certbot
パッケージは、デフォルトではパッケージマネージャーからは利用できません。 Certbotをインストールするには、EPELリポジトリを有効にする必要があります。
CentOS 8 EPELリポジトリを追加するには、次のコマンドを実行します。
sudo dnf install epel-release
リポジトリにアクセスできるようになったので、必要なすべてのパッケージをインストールします。
sudo dnf install certbot python3-certbot-apache mod_ssl
これらのサービスをインストールすると、Certbotを実行して証明書を取得する準備が整います。
ステップ2—証明書を取得する
Certbotがインストールされたので、それを使用してドメインのSSL証明書を要求できます。
certbot
Let's Encryptクライアントを使用してApacheのSSL証明書を生成すると、プロセスの多くのステップが自動化されます。 クライアントは、パラメータとして指定したドメインに有効な新しいSSL証明書を自動的に取得してインストールします。
インタラクティブインストールを実行し、単一のドメインのみをカバーする証明書を取得するには、次のコマンドを使用してcertbot
コマンドを実行します。
sudo certbot --apache -d example.com
これは、--apache
プラグインでcertbot
を実行し、-d
フラグで証明書を構成するドメインを指定します。
複数のドメインまたはサブドメインに有効な単一の証明書をインストールする場合は、それらを追加のパラメーターとしてコマンドに渡し、新しい各ドメインまたはサブドメインに-d
フラグをタグ付けできます。 パラメータリストの最初のドメイン名は、Let'sEncryptが証明書を作成するために使用するbaseドメインになります。 このため、リストの最初にベースドメイン名を渡し、その後に追加のサブドメインまたはエイリアスを渡します。
sudo certbot --apache -d example.com -d www.example.com
この例のベースドメインはexample.com
です。
certbot
ユーティリティは、既存のApache構成に基づいてドメインを選択するように求めるプロンプトを表示することもできます。 この機能を使用するには、ドメインを指定せずにcertbot
を呼び出します。
sudo certbot --apache
プログラムは、証明書オプションをカスタマイズするためのステップバイステップガイドを提供します。 紛失したキーの回復と通知用の電子メールアドレスを提供するように求められ、次に利用規約に同意するように求められます。 コマンドラインでドメインを指定しなかった場合は、その入力も求められます。 仮想ホストファイルがServerName
ディレクティブを使用して明示的に提供するドメインを指定していない場合は、仮想ホストファイルを選択するように求められます。
インストールが正常に完了すると、次のようなメッセージが表示されます。
OutputIMPORTANT 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 2020-09-24. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - 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
生成された証明書ファイルは、/etc/letsencrypt/live
ディレクトリのベースドメインにちなんで名付けられたサブディレクトリ内で利用できます。
証明書がダウンロード、インストール、およびロードされたので、SSL証明書のステータスをチェックして、すべてが機能していることを確認できます。
ステップ3—証明書とSSL構成をテストする
この時点で、クラウドセキュリティ会社 QualysのSSLサーバーテストを使用して、CertbotがSSL証明書を正しく作成したことを確認できます。
example.com
をドメインに置き換えて、お好みのWebブラウザで次のリンクを開きます。
https://www.ssllabs.com/ssltest/analyze.html?d=example.com
サーバーへのSSL接続のテストをすぐに開始するページが表示されます。
テストの実行が開始されると、完了するまでに数分かかる場合があります。 テストのステータスはブラウザで更新されます。
テストが終了すると、サーバーの構成のセキュリティと品質を評価するレターグレードがページに表示されます。 この記事の執筆時点では、デフォルト設定はAの評価を与えます。
SSL Labsがこれらの評価を決定する方法の詳細については、 SSL Labsの評価投稿で、2018年1月に評価スキームに加えられた更新の詳細を確認してください。
https://
を使用してウェブサイトをリロードしてみて、ブラウザのセキュリティインジケータに注目してください。 これで、サイトが適切に保護されていることが示され、通常は鍵のアイコンが表示されます。
SSL証明書をインストールして検証したら、次のステップは、証明書の自動更新を設定して、証明書を有効に保つことです。
ステップ4—自動更新の設定
Let's Encryptの証明書は90日間有効ですが、失効やその他の問題が発生した場合に備えて、更新を1日2回確認することをお勧めします。 このため、このプロセスを自動化することがベストプラクティスです。
まず、証明書を更新するために使用するコマンドを調べてみましょう。 certbot
Let'sEncryptクライアントにはrenew
コマンドがあり、現在インストールされている証明書を自動的にチェックし、有効期限から30日以内の場合は更新を試みます。 --dry-run
オプションを使用すると、このタスクのシミュレーションを実行して、renew
がどのように機能するかをテストできます。
sudo certbot renew --dry-run
出力は次のようになります。
OutputSaving 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 apache, Installer apache Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org 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 Resetting dropped connection: acme-staging-v02.api.letsencrypt.org - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - new certificate deployed with reload of apache 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) ...
複数のドメインでバンドルされた証明書を作成した場合、ベースドメイン名のみが出力に表示されますが、更新はこの証明書に含まれるすべてのドメインに対して有効であることに注意してください。
証明書が古くならないようにするための実用的な方法は、自動更新コマンドを定期的に実行するcronジョブを作成することです。
公式のCertbotドキュメントは、cron
を1日2回実行することを推奨しています。 これにより、Let's Encryptが証明書の失効を開始した場合、Certbotが証明書を更新するまでに半日以内になります。 ドキュメントでは、次のコマンドを使用して、適切なcron
ジョブを/etc/crontab
crontabファイルに追加することを提案しています。
echo "0 0,12 * * * root python3 -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null
これにより、毎日正午と深夜に実行される新しいcronジョブが作成されます(0 0,12 * * *
)。 次に、短いpython3
スクリプトを実行します。このスクリプトは、0〜60分のランダムな期間一時停止します。 Let's Encryptのサーバーの負荷を軽減するために、これをお勧めします。
Pythonスクリプトが終了すると、実際のcertbot renew
コマンドが実行されます。
cronジョブを作成およびスケジュールする方法の詳細については、Cronを使用してCentOS8でタスクを自動化する方法ガイドを確認してください。 更新の詳細については、Certbotのドキュメントを参照してください。
結論
このガイドでは、Let's Encrypt Certbotクライアントをインストールし、ドメインのSSL証明書をダウンロードし、証明書の自動更新を設定しました。 Certbotの使用について質問がある場合は、Certbotの公式ドキュメントを確認してください。 また、公式の Let's Encryptブログで、重要な更新を随時確認することをお勧めします。