ウェブサイト検索

RHEL/CentOS 7/6 で Apache を保護するために Let's Encrypt SSL 証明書をインストールする方法


SSL/TLS 無料証明書に関する前回の Let's Encrypt チュートリアルを拡張して、この記事では、Let's Encrypt 認証局が発行した Apache< 用の無料 SSL/TLS 証明書を取得してインストールする方法を説明します。 CentOS/RHEL 7/6 および Fedora ディストリビューション上の Web サーバー。

Debian および Ubuntu に Let’s Encrypt for Apache をインストールする場合は、以下のガイドに従ってください。

Debian および Ubuntu で Apache を保護するために Let’s Encrypt をセットアップする

テストサンプル環境

要件

  1. サーバーのパブリック IP アドレスを指す、有効な A レコードを持つ登録済みのドメイン名。
  2. 複数のドメインまたはサブドメインをホストしている場合は、SSL モジュールが有効になり、仮想ホスティングが有効になった状態で Apache サーバーがインストールされます。

ステップ 1: Apache Web サーバーをインストールする

1. httpd デーモンがまだインストールされていない場合は、次のコマンドを実行してインストールできます。

yum install httpd

2. Let's encrypt ソフトウェアを Apache で動作させるには、以下のコマンドを実行して SSL/TLS モジュールがインストールされていることを確認します。

yum -y install mod_ssl

3. 最後に、次のコマンドを使用して Apache サーバーを起動します。

systemctl start httpd.service          [On RHEL/CentOS 7]
service httpd start                    [On RHEL/CentOS 6]

ステップ 2: Let’s Encrypt SSL 証明書をインストールする

4. Let’s Encrypt クライアントをインストールする最も簡単な方法は、ファイル システム内で github リポジトリのクローンを作成することです。システムに git をインストールするには、次のコマンドを使用して Epel リポジトリを有効にする必要があります。

yum install epel-release

5. Epel リポジトリがシステムに追加されたら、次のコマンドを実行して git クライアントをインストールします。

yum install git

6. 次に、Let's Encrypt を処理するために必要な依存関係をすべてインストールしたら、/usr/local/ ディレクトリに移動して、Let's Encrypt クライアント フォームの取得を開始します。次のコマンドを使用して、公式 github リポジトリにアクセスします。

cd /usr/local/
git clone https://github.com/letsencrypt/letsencrypt

ステップ 3: Apache 用の無料の Let’s Encrypt SSL 証明書を取得する

7. Apache 用の無料の Let’s Encrypt 証明書を取得するプロセスは、Apache プラグインのおかげで CentOS/RHEL では自動化されています。

SSL 証明書を取得するために、Let's Encrypt スクリプト コマンドを実行してみましょう。 /usr/local/letsencrypt から Let's Encrypt インストール ディレクトリに移動し、--apache オプションと --apache オプションを指定して letsencrypt-auto コマンドを実行します。証明書が必要なサブドメインごとに-d フラグを設定します。

cd /usr/local/letsencrypt
./letsencrypt-auto --apache -d your_domain.tld 

8. 紛失したキーを回復するため、または緊急通知のために Let's Encrypt が使用する電子メール アドレスを入力し、Enter を押して続行します。

9. Enter キーを押してライセンス条項に同意します。

10. CentOS/RHEL では、Apache サーバーはデフォルトで、Debian のように、有効なホストのディレクトリを使用可能な (非アクティブな) ホストから分離するという概念を使用しません。 Strong> ベースの配布を行います。

また、仮想ホスティングはデフォルトでは無効になっています。サーバーの名前 (ServerName) を指定する Apache ステートメントは、SSL 構成ファイルには存在しません。

このディレクティブを有効にするには、Let’s Encrypt は仮想ホストを選択するように求めます。使用可能な Vhost が見つからないため、Let’s Encrypt クライアントによって自動的に変更される ssl.conf ファイルを選択し、Enter を押して続行します。

11. 次に、HTTP リクエストの Easy メソッドを選択し、Enter を押して次に進みます。

12. 最後に、すべてが順調に進むと、画面にお祝いのメッセージが表示されます。 Enter を押してプロンプトを解除します。

それでおしまい!ドメインのSSL/TLS証明書が正常に発行されました。これで、HTTPS プロトコルを使用して Web サイトの閲覧を開始できるようになります。

ステップ 4: ドメインで Let's Encrypt 暗号化を無料でテストする

13. ドメインの SSL/TLS ハンドシェイクの正確性をテストするには、以下のリンクにアクセスし、ドメインで証明書をテストします。

https://www.ssllabs.com/ssltest/analyze.html

14. 実施したテストでドメインの脆弱性に関する一連のレポートを受け取った場合は、それらのセキュリティ ホールを早急に修正する必要があります。

全体的な評価が C クラスの場合、ドメインは非常に安全ではありません。これらのセキュリティ問題を解決するには、Apache SSL 構成ファイルを開いて次の変更を加えます。

vi /etc/httpd/conf.d/ssl.conf

SSLProtocol ステートメントを含む行を検索し、行の末尾に -SSLv3 を追加します。

ファイルのさらに奥に進み、SSLCipherSuite を含む行を検索し、行の前に # を配置してコメント化し、この行の下に次の内容を追加します。

SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
SSLHonorCipherOrder     on
SSLOptions +StrictRequire

15. 上記の変更をすべて行ったら、ファイルを保存して閉じ、Apache デーモンを再起動して変更を適用します。

systemctl restart httpd.service          [On RHEL/CentOS 7]
service httpd restart                    [On RHEL/CentOS 6]

16. 次に、上記と同じリンクにアクセスして、ドメイン暗号化のステータスを再度テストします。再テストを実行するには、Web サイトから [キャッシュのクリア] リンクをクリックします。

https://www.ssllabs.com/ssltest/analyze.html 

これで、クラス A の総合評価が得られます。これは、ドメインの安全性が高いことを意味します。

ステップ 4: Apache で Let's Encrypt 証明書を自動更新する

17. Let’s Encrypt ソフトウェアのこのベータ版は、90 日後の有効期限を持つ証明書をリリースします。したがって、SSL 証明書を更新するには、最初の証明書の取得に使用したものと同じオプションとフラグを使用して、有効期限が切れる前に letsencrypt-auto コマンドを再度実行する必要があります。

証明書を手動で更新する方法の例を以下に示します。

cd /usr/local/letsencrypt
./letsencrypt-auto certonly --apache --renew-by-default  -d your_domain.tld

18. このプロセスを自動化するには、github erikaheidi によって提供される次の bash スクリプトを、次の内容で /usr/local/bin/ ディレクトリに作成します。 (スクリプトは、letsencrypt インストール ディレクトリを反映するためにわずかに変更されています)。

vi /usr/local/bin/le-renew-centos

次の内容を le-renew-centos ファイルに追加します。

!/bin/bash

domain=$1
le_path='/usr/local/letsencrypt'
le_conf='/etc/letsencrypt'
exp_limit=30;

get_domain_list(){
        certdomain=$1
        config_file="$le_conf/renewal/$certdomain.conf"

        if [ ! -f $config_file ] ; then
                echo "[ERROR] The config file for the certificate $certdomain was not found."
                exit 1;
        fi

        domains=$(grep --only-matching --perl-regex "(?<=domains \= ).*" "${config_file}")
        last_char=$(echo "${domains}" | awk '{print substr($0,length,1)}')

        if [ "${last_char}" = "," ]; then
                domains=$(echo "${domains}" |awk '{print substr($0, 1, length-1)}')
        fi

        echo $domains;
}

if [ -z "$domain" ] ; then
        echo "[ERROR] you must provide the domain name for the certificate renewal."
        exit 1;
fi

cert_file="/etc/letsencrypt/live/$domain/fullchain.pem"

if [ ! -f $cert_file ]; then
        echo "[ERROR] certificate file not found for domain $domain."
        exit 1;
fi

exp=$(date -d "`openssl x509 -in $cert_file -text -noout|grep "Not After"|cut -c 25-`" +%s)
datenow=$(date -d "now" +%s)
days_exp=$(echo \( $exp - $datenow \) / 86400 |bc)

echo "Checking expiration date for $domain..."

if [ "$days_exp" -gt "$exp_limit" ] ; then
        echo "The certificate is up to date, no need for renewal ($days_exp days left)."
        exit 0;
else
        echo "The certificate for $domain is about to expire soon. Starting renewal request..."
        domain_list=$( get_domain_list $domain )
        "$le_path"/letsencrypt-auto certonly --apache --renew-by-default --domains "${domain_list}"
        echo "Restarting Apache..."
        /usr/bin/systemctl restart httpd
        echo "Renewal process finished for domain $domain"
        exit 0;
fi

19. スクリプトの実行権限を付与し、bc パッケージをインストールしてスクリプトを実行してテストします。ドメイン名をスクリプトの位置パラメータとして使用します。この手順を実行するには、次のコマンドを発行します。

yum install bc
chmod +x /usr/local/bin/le-renew-centos
/usr/local/bin/le-renew-centos your_domain.tld

20. 最後に、Linux スケジューリングを使用して、スクリプトを 2 か月ごとに実行するための新しい cron ジョブを追加し、有効期限が切れる前に証明書が更新されるようにします。

crontab -e

ファイルの最後に次の行を追加します。


0 1 1 */2 * /usr/local/bin/le-renew-centos your_domain.tld >> /var/log/your_domain.tld-renew.log 2>&1

それでおしまい! CentOS/RHEL システム上で実行されている Apache サーバーは、無料の Let’s Encrypt SSL 証明書を使用して SSL コンテンツを提供しています。