RHEL/CentOS 7/6でApacheをセキュアにするためにLet’s Encrypt SSL証明書をインストールする方法

直近のLet’s Encryptチュートリアルを拡張して、SSL/TLS無料証明書に関して、この記事では、Let’s Encrypt証明機関から発行された無料SSL/TLS証明書をApacheウェブサーバーに取得してインストールする方法を示します。また、CentOS/RHEL 7/6およびFedoraディストリビューションでも同様に行います。

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

DebianとUbuntuでApacheをセキュアにするためにLet’s Encryptをセットアップする

テスト用環境の構築
Install Lets Encrypt for Apache on CentOS and RHEL

要件

  1. A registered domain name with valid A records to point back to your server public IP Address.
  2. SSLモジュールが有効になっていて、複数のドメインまたはサブドメインをホストしている場合は仮想ホスティングが有効になっているApacheサーバーがインストールされていること。

ステップ1: Apacheウェブサーバーのインストール

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/ ディレクトリに移動し、次のコマンドで公式の GitHub リポジトリから Let’s Encrypt クライアントを取得し始めます。

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

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

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

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

# cd /usr/local/letsencrypt
# ./letsencrypt-auto --apache -d your_domain.tld 
Create Lets Encrypt SSL Certificate for Apache

8. Let’s Encrypt が失われたキーを回復するために使用するメールアドレスを提供し、Enter キーを押して続行してください。

Add Email Address for Lets Encrypt

9. Enter キーを押してライセンス条項に同意してください。

Agree Lets Encrypt License

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

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

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

Active VirtualHost Directive and Select Mod_SSL

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

Allow Easy HTTP Requests

12.最後に、すべてがスムーズに進んだ場合、画面に祝辞メッセージが表示されます。プロンプトを解除するにはEnterを押します。

Lets Encrypt Enabled on Domain

以上です!ドメインのSSL/TLS証明書を正常に発行しました。これで、HTTPSプロトコルを使用してウェブサイトを閲覧できます。

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

13.ドメインのSSL/TLSハンドシェイクの直線性をテストするために、以下のリンクを訪れ、ドメインで証明書をテストしてください。

https://www.ssllabs.com/ssltest/analyze.html
Verify Lets Encrypt Certificate on Domain

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

総合評価がCクラスの場合、ドメインは非常に安全ではありません。これらのセキュリティの問題を修正するには、Apache SSL設定ファイルを開き、次の変更を行います:

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

「SSLProtocol」ステートメントが含まれる行を検索し、その行の末尾に「-SSLv3」を追加します。

Fix Apache SSL Configuration

ファイルをさらに掘り下げ、次の内容を追加するために「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
Configure SSL Configuration

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

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

16. 今、ドメインの暗号化の状態を再度テストするために、前述のリンクを訪れてください。再テストを行うには、ウェブサイトから「Clear cache」リンクをクリックしてください。

https://www.ssllabs.com/ssltest/analyze.html 
Test Lets Encrypt SSL Certificate on Website

これで、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. このプロセスを自動化するには、以下の内容のbashスクリプトを作成します。スクリプトはGitHubのerikaheidiで提供されています。内容は下記の通りで、/usr/local/bin/ディレクトリに保存します(スクリプトは当社のLet’s Encryptインストールディレクトリを反映してわずかに変更されています)。

# 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コンテンツを提供するようになりました。

Source:
https://www.tecmint.com/install-lets-encrypt-ssl-certificate-to-secure-apache-on-rhel-centos/