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

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

序章

Let's Encrypt は、 Transport Layer Security(TLS)暗号化の無料証明書を提供する認証局(CA)であり、これによりWebサーバーで暗号化されたHTTPSを有効にします。 ほとんどの手順を自動化するソフトウェアクライアントCertbotを提供することにより、証明書の作成、検証、署名、インストール、および更新のプロセスを簡素化します。

このチュートリアルでは、Certbotを使用して、ApacheをWebサーバーとして実行しているCentOS7サーバーでLet'sEncryptからTLS/SSL証明書を設定します。 さらに、cronジョブを使用して証明書の更新プロセスを自動化します。これについては、Cronを使用してVPSでタスクを自動化する方法を参照してください。

前提条件

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

  • CentOS7初期サーバーセットアップガイドに従ってsudo権限を持つ非rootユーザーでセットアップされた1台のCentOS7サーバー。
  • 新しいCentOS7サーバーの追加の推奨手順ガイドに従って構成された基本的なファイアウォール。
  • 仮想ホストが構成されたCentOS7サーバーにインストールされたApache。 これを設定する方法については、チュートリアル CentOS7にApacheWebサーバーをインストールする方法に従ってください。 ドメインに仮想ホストファイルがあることを確認してください。 このチュートリアルでは、例として/etc/httpd/sites-available/example.com.confを使用します。
  • 証明書を使用する登録済みドメイン名を所有または管理する必要があります。 ドメイン名をまだ登録していない場合は、 Namecheap で購入するか、 Freenom で無料で入手するか、選択したドメイン登録事業者を使用できます。
  • ドメインがサーバーのパブリックIPアドレスを指すDNSARecord。 DigitalOceanプラットフォームでDNSを追加する方法の詳細については、このDigitalOceanDNSの概要をフォローしてください。 Let's Encryptが証明書を発行しているドメインを所有していることを検証する方法のため、DNSAレコードが必要です。 たとえば、example.comの証明書を取得する場合、検証プロセスを機能させるには、そのドメインをサーバーに解決する必要があります。 この設定では、ドメイン名としてexample.comwww.example.comを使用します。どちらも、有効なDNSレコードが必要です。

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

ステップ1— CertbotLet'sEncryptクライアントのインストール

Let's Encryptを使用してSSL証明書を取得するには、最初にCertbotと mod_ssl 、SSLv3暗号化のサポートを提供するApacheモジュールをインストールする必要があります。

certbotパッケージは、デフォルトではパッケージマネージャーからは利用できません。 Certbotをインストールするには、EPELリポジトリを有効にする必要があります。

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

sudo yum install epel-release

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

sudo yum install certbot python2-certbot-apache mod_ssl

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

これらのサービスをインストールすると、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ユーティリティは、証明書の要求手順中にドメイン情報の入力を求めることもできます。 この機能を使用するには、ドメインなしでcertbotを呼び出します。

sudo certbot --apache

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

httphttpsの両方のアクセスを有効にするか、すべてのリクエストを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):2

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

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 2019-08-14. 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—証明書のステータスを確認する

この時点で、クラウドセキュリティ会社 QualysSSLサーバーテストを使用して、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日間有効ですが、エラーの許容範囲を確保するために、60日ごとに証明書を更新することをお勧めします。 このため、このプロセスを自動化して、証明書を定期的にチェックおよび更新することをお勧めします。

まず、証明書を更新するために使用するコマンドを調べてみましょう。 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ジョブを作成することです。 更新は最初に有効期限をチェックし、証明書の有効期限が30日以内の場合にのみ更新を実行するため、毎週または毎日実行するcronジョブを作成しても安全です。

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

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

sudo crontab -e

テキストエディタは、この時点で空のテキストファイルであるデフォルトのcrontabを開きます。 このチュートリアルでは、viテキストエディタを使用します。 このテキストエディタとその後継のvimの詳細については、クラウドサーバーへのVimテキストエディタのインストールと使用チュートリアルをご覧ください。

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

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

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

cronジョブを作成およびスケジュールする方法の詳細については、VPSガイドでCronを使用してタスクを自動化する方法を確認してください。 更新の詳細については、Certbotのドキュメントを参照してください。

結論

このガイドでは、Let's Encrypt Certbotクライアントをインストールし、ドメインのSSL証明書をダウンロードし、証明書の自動更新を設定しました。 Certbotの使用について質問がある場合は、Certbotの公式ドキュメントを確認してください。 また、公式の Let's Encryptブログで、重要な更新を随時確認することをお勧めします。