CentOS 7でLet’s Encryptを使用してApacheを保護する方法

前書き

Let’s Encryptは、https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-に無料の証明書を提供する認証局(CA)です。 private-keys-and-csrs [トランスポート層セキュリティ(TLS)暗号化]。これにより、Webサーバーで暗号化されたHTTPSが有効になります。 ほとんどの手順(https://certbot.eff.org/[Certbot])を自動化するソフトウェアクライアントを提供することにより、証明書の作成、検証、署名、インストール、および更新のプロセスを簡素化します。

このチュートリアルでは、Certbotを使用して、ApacheをWebサーバーとして実行しているCentOS 7サーバーでLet’s EncryptからTLS / SSL証明書を設定します。 さらに、cronジョブを使用して証明書の更新プロセスを自動化します。これについて詳しくは、https://www.digitalocean.com/community/tutorials/how-to-use-cron-to-automate-tasks-を参照してください。 on-a-vps [Cronを使用してVPSのタスクを自動化する方法]。

前提条件

このガイドを完了するには、次のものが必要です。

  • CentOS 7初期サーバーセットアップガイドに従って、非ルートユーザーと`+ sudo +`特権。

  • https://www.digitalocean.com/community/tutorials/additional-recommended-steps-for-new-centos-7-servers#configuring-a-basic-firewall [新しい追加の推奨手順]に従って構成された基本的なファイアウォールCentOS 7サーバー]ガイド。

  • 仮想ホストが構成されたCentOS 7サーバーにインストールされたApache。 チュートリアルhttps://www.digitalocean.com/community/tutorials/how-to-install-the-apache-web-server-on-centos-7 [インストール方法CentOS 7上のApache Webサーバー]。 ドメインの仮想ホストファイル。 このチュートリアルでは、例として「+ / etc / httpd / sites-available / .conf +」を使用します。

  • 証明書を使用する登録済みドメイン名を所有または制御する必要があります。 登録済みのドメイン名をまだお持ちでない場合は、https://namecheap.com [Namecheap]で購入できます。http://www.freenom.com/en/index.html [Freenom]で無料で入手できます。 、または選択したドメインレジストラを使用します。

  • ドメインがサーバーのパブリックIPアドレスを指すDNS レコード。 DigitalOceanプラットフォームでそれらを追加する方法の詳細については、https://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-dns [DigitalOcean DNSの概要]を参照してください。 DNS Aレコードは、Let’s Encryptが証明書を発行しているドメインの所有者であることを検証する方法のために必要です。 たとえば、「」の証明書を取得する場合、検証プロセスが機能するためには、そのドメインがサーバーに解決される必要があります。 このセットアップでは、ドメイン名として「」と「++」を使用しますが、どちらも有効なDNSレコードが必要です。

これらの前提条件をすべて完了したら、次に、Let’s Encryptクライアントソフトウェアのインストールに進みます。

ステップ1-Certbot Let’s Encrypt Clientのインストール

Let’s Encryptを使用してSSL証明書を取得するには、最初にCertbotとhttps://httpd.apache.org/docs/2.4/mod/mod_ssl.html [+ mod_ssl +]をインストールする必要があります。 SSL v3暗号化。

`+ certbot +`パッケージは、デフォルトではパッケージマネージャーを介して利用できません。 Certbotをインストールするには、https://fedoraproject.org/wiki/EPEL [EPEL]リポジトリを有効にする必要があります。

CentOS 7 EPELリポジトリを追加するには、次のコマンドを実行します。

sudo yum install epel-release

リポジトリにアクセスできるようになったので、必要なパッケージをすべてインストールします。

sudo yum install certbot python2-certbot-apache mod_ssl

インストールプロセス中に、GPGキーのインポートについて尋ねられます。 このキーは、インストールするパッケージの信頼性を検証します。 インストールを完了するには、「+ y 」と入力してGPGキーを受け入れ、プロンプトが表示されたら「 ENTER +」を押します。

これらのサービスをインストールすると、Certbotを実行して証明書を取得する準備ができました。

ステップ2-証明書の取得

Certbotがインストールされたので、これを使用してドメインのSSL証明書を要求できます。

「+ certbot +」を使用して、クライアントを暗号化してApacheのSSL証明書を生成すると、プロセスの多くのステップが自動化されます。 クライアントは、パラメーターとして指定したドメインに対して有効な新しいSSL証明書を自動的に取得してインストールします。

対話型インストールを実行し、1つのドメインのみを対象とする証明書を取得するには、次のコマンドで `+ certbot +`コマンドを実行します

sudo certbot --apache -d

これは、 `-apache +`プラグインで ` certbot `を実行し、 ` -d +`フラグで証明書を設定するドメインを指定します。

複数のドメインまたはサブドメインに有効な単一の証明書をインストールする場合、それらをコマンドに追加パラメーターとして渡し、新しいドメインまたはサブドメインに「+ -d +」フラグをタグ付けできます。 パラメータのリストの最初のドメイン名は、Let’s Encryptが証明書を作成するために使用する* base *ドメインです。 このため、リストの最初にベースドメイン名を渡し、その後に追加のサブドメインまたはエイリアスを続けます。

sudo certbot --apache -d  -d

この例の基本ドメインは「+ example.com +」です。

`+ certbot `ユーティリティは、証明書要求手順中にドメイン情報の入力を求めることもできます。 この機能を使用するには、ドメインなしで ` certbot +`を呼び出します:

sudo certbot --apache

プログラムは、証明書オプションをカスタマイズするための段階的なガイドを提供します。 失われたキーの回復と通知のための電子メールアドレスを提供するように求められ、その後、利用規約に同意するように求められます。 コマンドラインでドメインを指定しなかった場合は、同様に入力を求められます。 仮想ホストファイルが、 `+ ServerName `ディレクティブを使用して明示的に提供するドメインを指定しない場合、仮想ホストファイルを選択するよう求められます。 ほとんどの場合、デフォルトの ` ssl.conf`ファイルは動作します。

また、「+ http」と「+ https」の両方のアクセスを有効にするか、すべてのリクエストを「+ https 」にリダイレクトするかを選択できます。 セキュリティを向上させるために、暗号化されていない接続を許可する特別な必要がない場合は、オプション「+2:Redirect +」を選択することをお勧めします。 選択項目を選択し、「 ENTER」を押します。

OutputPlease choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

インストールが正常に終了すると、次のようなメッセージが表示されます。

OutputIMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
  /etc/letsencrypt/live//fullchain.pem
  Your key file has been saved at:
  /etc/letsencrypt/live//privkey.pem
  Your cert will expire on . 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"
- 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-証明書のステータスを確認する

この時点で、クラウドセキュリティ会社https://www.qualys.com/[SSL Server Testを使用して、CertbotがSSL証明書を正しく作成したことを確認できます。 Qualys]。

好みのWebブラウザで次のリンクを開き、「++」を* base *ドメインに置き換えます。

https://www.ssllabs.com/ssltest/analyze.html?d=

サーバーへのSSL接続のテストをすぐに開始するページに移動します。

image:https://assets.digitalocean.com/articles/LE_CentOS7_66505/SSL_Server_Test.png [SSLサーバーテスト]

テストの実行が開始されてから、完了するまでに数分かかる場合があります。 テストのステータスがブラウザで更新されます。

テストが完了すると、ページにサーバーの構成のセキュリティと品質を評価するレターグレードが表示されます。 この記事の執筆時点では、デフォルト設定は* A *評価を与えます。

image:https://assets.digitalocean.com/articles/LE_CentOS7_66505/SSL_Report_A.png [SSLレポート-A]

SSL Labsがこれらのグレードを決定する方法の詳細については、https://community.qualys.com/docs/DOC-6321-ssl-labs-grading-2018 [SSL Labs Grading post]をチェックして、グレーディングに加えられた更新の詳細を確認してください。 2018年1月のスキーム。

`+ https:// +`を使用してウェブサイトをリロードしてみて、ブラウザのセキュリティインジケータに注目してください。 これで、サイトが適切に保護されていることが示され、通常は緑色のロックアイコンが表示されます。

SSL証明書をセットアップして検証したら、次のステップは、証明書の自動更新をセットアップして証明書を有効に保つことです。

ステップ4-自動更新の設定

Let’s Encrypt証明書は90日間有効ですが、エラーを許容するために60日ごとに証明書を更新することをお勧めします。 このため、このプロセスを自動化して証明書を定期的に確認および更新することがベストプラクティスです。

まず、証明書を更新するために使用するコマンドを調べてみましょう。 + certbot + Let’s Encryptクライアントには、現在インストールされている証明書を自動的にチェックし、有効期限から30日以内にある場合に更新を試みる `+ renew `コマンドがあります。 `-dry-run `オプションを使用すると、このタスクのシミュレーションを実行して、 ` renew +`の動作をテストできます。

sudo certbot renew --dry-run

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

OutputSaving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/.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
http-01 challenge for
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//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//fullchain.pem (success)
...

複数のドメインを含むバンドルされた証明書を作成した場合、ベースドメイン名のみが出力に表示されますが、更新はこの証明書に含まれるすべてのドメインに対して有効であることに注意してください。

証明書が古くならないようにするための実用的な方法は、https://www.digitalocean.com/community/tutorials/how-to-use-cron-to-automate-tasks-on-a-vps [cronを作成することですジョブ]が定期的に自動更新コマンドを実行します。 更新は最初に有効期限をチェックし、証明書の有効期限が30日以内の場合にのみ更新を実行するため、毎週または毎日実行されるcronジョブを安全に作成できます。

Certbotの公式ドキュメントでは、1日2回「+ cron +」を実行することを推奨しています。 これにより、Let’s Encryptが証明書の失効を開始した場合、Certbotが証明書を更新するまでに半日以内になります。

`+ crontab `を編集して、更新を1日に2回実行する新しいジョブを作成します。 * root *ユーザーの ` crontab +`を編集するには、次を実行します:

sudo crontab -e

テキストエディタは、この時点で空のテキストファイルであるデフォルトの `+ crontab +`を開きます。 このチュートリアルでは、viテキストエディターを使用します。 このテキストエディターとその後継_vim_の詳細については、https://www.digitalocean.com/community/tutorials/installing-and-using-the-vim-text-editor-on-a-cloud-serverをご覧ください。 #managing-documents [クラウドサーバーでのVimテキストエディターのインストールと使用]チュートリアル。

`+ i +`を押して挿入モードに入り、次の行を追加します。

crontab0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew

終了したら、 `+ ESC `を押して挿入モードを終了し、 `:wq `と ` ENTER `を押してファイルを保存して終了します。 これにより、毎日正午と真夜中に実行される新しいcronジョブが作成されます。 cronジョブにランダム性の要素を追加すると、1時間ごとのジョブがすべて同じ分に発生しないようになり、サーバーのスパイクが発生します。 ` python -c 'ランダムにインポート。インポート時間; time.sleep(random.random()* 3600) '+ `は、更新タスクのために1時間以内にランダムな分を選択します。

cronジョブを作成およびスケジュールする方法の詳細については、https://www.digitalocean.com/community/tutorials/how-to-use-cron-to-automate-tasks-on-a-vps [ Cronを使用してVPSのタスクを自動化する方法]ガイド。 更新の詳細については、https://certbot.eff.org/docs/using.html#renewal [Certbot documentation]をご覧ください。

結論

このガイドでは、Let’s Encrypt Certbotクライアントをインストールし、ドメインのSSL証明書をダウンロードし、証明書の自動更新を設定しました。 Certbotの使用について質問がある場合は、公式のhttps://certbot.eff.org/docs/[Certbot documentation]を確認できます。 また、公式のhttps://letsencrypt.org/blog/[Let’s Encrypt blog]で重要な更新を随時確認することをお勧めします。

前の投稿:Python 3で* argsと** kwargsを使用する方法
次の投稿:Python 3でWeb APIを使用する方法