Certbotスタンドアロンモードを使用して、CentOS 7でSSL証明書を暗号化して取得する方法

前書き

Let’s Encryptは、自動化されたAPIを介して無料のSSL証明書を提供するサービスです。 最も人気のあるLet’s EncryptクライアントはEFFCertbotです。

Certbotは、ドメインを検証し、証明書を取得し、ApacheおよびNginxを自動的に構成するためのさまざまな方法を提供します。 このチュートリアルでは、Certbotのstandaloneモードと、それを使用してメールサーバーやRabbitMQなどの他のタイプのサービスを保護する方法について説明します。

SSL構成の詳細については説明しませんが、完了すると、自動的に更新される有効な証明書が得られます。 さらに、サービスのリロードを自動化して、更新された証明書を取得できます。

前提条件

このチュートリアルを開始する前に、次のものが必要です。

  • this CentOS 7 initial server setup tutorialで詳しく説明されているように、root以外のsudo対応ユーザーがいるCentOS7サーバー。

  • サーバーを指すドメイン名。これは、「https://www.digitalocean.com/community/tutorials/how-to-set-up-a-host-name-with-digitalocean [設定方法DigitalOceanでホスト名をアップ]。」このチュートリアルでは、全体を通してexample.comを使用します。

  • ポート80or443はサーバーで使用されていない必要があります。 保護しようとしているサービスが、これらのポートの両方を占有するWebサーバーを備えたマシン上にある場合は、Certbotのwebroot modeなどの別のモードを使用する必要があります。

[[step-1 -—- installing-certbot]] ==ステップ1—Certbotのインストール

Certbotは、Extra Packages for Enterprise Linux(EPEL)と呼ばれる追加のリポジトリにパッケージ化されています。 CentOS 7でこのリポジトリを有効にするには、次のyumコマンドを実行します。

sudo yum --enablerepo=extras install epel-release

その後、certbotパッケージをyumとともにインストールできます。

sudo yum install certbot

certbotコマンドを呼び出すことにより、インストールが成功したことを確認できます。

certbot --version
Outputcertbot 0.31.0

Certbotがインストールされたので、それを実行して証明書を取得しましょう。

[[step-2 -—- running-certbot]] ==ステップ2—Certbotの実行

Certbotは、ドメインを制御していることを証明するために、Let’s Encrypt APIによって発行された暗号化の課題に答える必要があります。 これを実現するために、ポート80(HTTP)または443(HTTPS)を使用します。 ファイアウォールを使用している場合は、ここで適切なポートを開きます。 firewalldの場合、これは次のようになります。

sudo firewall-cmd --add-service=http
sudo firewall-cmd --runtime-to-permanent

ポート443を使用している場合は、上記のhttphttpsに置き換えてください。

これで、Certbotを実行して証明書を取得できます。 --standaloneオプションを使用して、独自の組み込みWebサーバーを使用してチャレンジを処理するようにCertbotに指示します。 --preferred-challengesオプションは、ポート80またはポート443を使用するようにCertbotに指示します。 ポート80を使用している場合は、--preferred-challenges httpが必要です。 ポート443の場合、--preferred-challenges tls-sniになります。 最後に、-dフラグを使用して、証明書を要求しているドメインを指定します。 複数の-dオプションを追加して、1つの証明書で複数のドメインをカバーできます。

sudo certbot certonly --standalone --preferred-challenges http -d example.com

コマンドを実行すると、メールアドレスを入力し、利用規約に同意するよう求められます。 そうすると、プロセスが成功したことと証明書の保存場所を示すメッセージが表示されます。

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 2018-10-09. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. 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

証明書を取得しました。 ダウンロードしたものと、ソフトウェアでファイルを使用する方法を見てみましょう。

[[step-3 -—- configuring-your-application]] ==ステップ3—アプリケーションの構成

アプリケーションごとに異なる要件と設定オプションがあるため、アプリケーションをSSL用に構成することはこの記事の範囲外ですが、Certbotがダウンロードしたものを見てみましょう。 lsを使用して、キーと証明書を保持するディレクトリを一覧表示します。

sudo ls /etc/letsencrypt/live/example.com
Outputcert.pem  chain.pem  fullchain.pem  privkey.pem  README

このディレクトリのREADMEファイルには、これらの各ファイルに関する詳細情報があります。 ほとんどの場合、これらのファイルのうち2つだけが必要です。

  • privkey.pem:これは証明書の秘密鍵です。 これは安全かつ秘密に保つ必要があります。そのため、/etc/letsencryptディレクトリのほとんどには非常に制限された権限があり、rootユーザーのみがアクセスできます。 ほとんどのソフトウェア構成では、これをssl-certificate-keyまたはssl-certificate-key-fileに類似したものと呼びます。

  • fullchain.pem:これは、すべての中間証明書にバンドルされている証明書です。 ほとんどのソフトウェアは、実際の証明書にこのファイルを使用し、「ssl-certificate」などの名前で構成内でこのファイルを参照します。

存在する他のファイルの詳細については、Certbotドキュメントの「https://certbot.eff.org/docs/using.html#where-are-my-certificates [私の証明書はどこですか]」セクションを参照してください。

一部のソフトウェアでは、他の形式、他の場所、または他のユーザー権限の証明書が必要になります。 すべてをletsencryptディレクトリに残し、そこで権限を変更しないことをお勧めします(とにかく、権限は更新時に上書きされるだけです)が、それがオプションではない場合もあります。 その場合、ファイルを移動し、必要に応じて権限を変更するスクリプトを作成する必要があります。 このスクリプトは、Certbotが証明書を更新するたびに実行する必要があります。これについては次に説明します。

[[step-4 -—- enableing-automatic-certificate-renewal]] ==ステップ4—自動証明書更新の有効化

Let's Encryptの証明書は90日間のみ有効です。 これは、ユーザーが証明書の更新プロセスを自動化することを奨励するためです。 インストールしたcertbotパッケージには、更新を1日2回チェックするsystemdタイマーが含まれていますが、デフォルトでは無効になっています。 次のコマンドを実行して、タイマーを有効にします。

sudo systemctl enable --now certbot-renew.timer
OutputCreated symlink from /etc/systemd/system/timers.target.wants/certbot-renew.timer to /usr/lib/systemd/system/certbot-renew.timer.

systemctlを使用して、タイマーのステータスを確認できます。

sudo systemctl status certbot-renew.timer
Output● certbot-renew.timer - This is the timer to set the schedule for automated renewals
   Loaded: loaded (/usr/lib/systemd/system/certbot-renew.timer; enabled; vendor preset: disabled)
   Active: active (waiting) since Fri 2019-05-31 15:10:10 UTC; 48s ago

タイマーはアクティブでなければなりません。 必要に応じて、Certbotはこのサーバー上の証明書を自動的に更新します。

[[step-5 --- running-tasks-when-certificates-are-renewed]] ==ステップ5—証明書が更新されたときにタスクを実行する

証明書が自動的に更新されるようになったので、更新後に特定のタスクを実行する方法が必要です。 新しい証明書を取得するには、少なくともサーバーを再起動またはリロードする必要があります。手順3で説明したように、使用しているソフトウェアで動作するように何らかの方法で証明書ファイルを操作する必要がある場合があります これがCertbotのrenew_hookオプションの目的です。

renew_hookを追加するには、Certbotの更新構成ファイルを更新します。 Certbotは、最初に証明書を取得した方法のすべての詳細を記憶しており、更新時に同じオプションで実行されます。 フックを追加するだけです。 好みのエディターで構成ファイルを開きます。

sudo vi /etc/letsencrypt/renewal/example.com.conf

テキストファイルがいくつかの構成オプションで開きます。 最後の行にフックを追加します。

/etc/letsencrypt/renewal/example.com.conf

renew_hook = systemctl reload rabbitmq

上記のコマンドを、サーバーのリロードやカスタムファイル変更スクリプトの実行に必要なものに更新します。 通常、CentOSでは、ほとんどの場合、systemctlを使用してサービスをリロードします。 ファイルを保存して閉じ、Certbotのドライランを実行して、構文に問題がないことを確認します。

sudo certbot renew --dry-run

エラーが表示されなければ、設定は完了です。 Certbotは、必要に応じて更新し、新しいファイルを使用してサービスを取得するために必要なコマンドを実行するように設定されています。

結論

このチュートリアルでは、Certbot Let's Encryptクライアントをインストールし、スタンドアロンモードを使用してSSL証明書をダウンロードし、更新フックを使用して自動更新を有効にしました。 これにより、一般的なウェブサーバー以外のサービスで証明書を暗号化して使用することができます。

詳細については、Certbot’s documentationを参照してください。

Related