Certbotスタンドアロンモードを使用してCentOS7でSSL証明書を暗号化して取得する方法
序章
Let's Encrypt は、自動化されたAPIを介して無料のSSL証明書を提供するサービスです。 最も人気のあるLet'sEncryptクライアントは、EFFのCertbotです。
Certbotは、ドメインを検証し、証明書をフェッチし、ApacheとNginxを自動的に構成するためのさまざまな方法を提供します。 このチュートリアルでは、Certbotのスタンドアロンモードと、それを使用してメールサーバーやRabbitMQなどのメッセージブローカーなどの他のタイプのサービスを保護する方法について説明します。
SSL構成の詳細については説明しませんが、完了すると、自動的に更新される有効な証明書が作成されます。 さらに、サービスのリロードを自動化して、更新された証明書を取得できるようになります。
前提条件
このチュートリアルを開始する前に、次のものが必要です。
- このCentOS7初期サーバーセットアップチュートリアルで詳しく説明されているように、root以外のsudo対応ユーザーがいるCentOS7サーバー。
- サーバーを指すドメイン名。これは、「DigitalOceanを使用してホスト名を設定する方法」に従って実行できます。 このチュートリアルでは、全体を通して
example.com
を使用します。 - ポート80または443はサーバーで使用されていない必要があります。 保護しようとしているサービスが、これらのポートの両方を占有するWebサーバーを備えたマシン上にある場合は、Certbotのwebrootモードなどの別のモードを使用する必要があります。
ステップ1—Certbotをインストールする
Certbotは、 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がインストールされたので、それを実行して証明書を取得しましょう。
ステップ2—Certbotを実行する
Certbotは、ドメインを制御していることを証明するために、Let'sEncryptAPIによって発行された暗号化の課題に答える必要があります。 これを実現するために、ポート80
(HTTP)または443
(HTTPS)を使用します。 ファイアウォールを使用している場合は、ここで適切なポートを開きます。 firewalld
の場合、これは次のようになります。
sudo firewall-cmd --add-service=http sudo firewall-cmd --runtime-to-permanent
ポート443を使用している場合は、上記のhttp
をhttps
に置き換えてください。
これで、Certbotを実行して証明書を取得できます。 --standalone
オプションを使用して、Certbotに独自の組み込みWebサーバーを使用してチャレンジを処理するように指示します。 --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
証明書を持っています。 ダウンロードしたものと、ソフトウェアでファイルを使用する方法を見てみましょう。
ステップ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ドキュメントの「証明書はどこにありますか」セクションを参照してください。
一部のソフトウェアは、他の形式、他の場所、または他のユーザー権限を持つ証明書を必要とします。 すべてをletsencrypt
ディレクトリに残し、そこにある権限を変更しないことをお勧めします(とにかく、権限は更新時に上書きされるだけです)が、それがオプションではない場合もあります。 その場合、必要に応じてファイルを移動し、権限を変更するためのスクリプトを作成する必要があります。 このスクリプトは、Certbotが証明書を更新するたびに実行する必要があります。これについては、次に説明します。
ステップ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は、必要に応じてこのサーバー上の証明書を自動的に更新するようになりました。
ステップ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証明書をダウンロードし、更新フックを使用して自動更新を有効にしました。 これにより、通常のWebサーバー以外のサービスでLet'sEncrypt証明書を使用するための良いスタートを切ることができます。
詳細については、Certbotのドキュメントを参照してください。