ウェブサイト検索

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


最後のLet’s Encryptチュートリアルを拡張し、この記事では、Let’s Encrypt証明書機関が発行する無料のSSL/TLS証明書をApacheウェブサーバーに適用し、CentOS/RHEL 7/6およびFedoraディストリビューションでもインストールする方法を示します。

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

DebianおよびUbuntuでApacheをセキュリティ保護するためにLet's Encryptを設定する

テストサンプル環境

要件

  1. サーバーの公開IPアドレスを指す有効なAレコードを持つ登録済みのドメイン名。
  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

ステップ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オプションと、証明書が必要なすべてのサブドメインに対する-dフラグを指定してletsencrypt-autoコマンドを実行します。

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

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

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

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

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

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

11. 次に、HTTP リクエストのために 簡単 メソッドを選択し、Enter を押して進んでください。

12. 最後に、すべてが順調に進んだ場合、画面にお祝いのメッセージが表示されるべきです。Enterを押してプロンプトを解除してください。

それです!あなたは自分のドメインに対してSSL/TLS証明書を正常に発行しました。これで、HTTPSプロトコルを使用してウェブサイトをブラウジングを開始できます。

ステップ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. では、上記のリンクに再度アクセスしてドメイン暗号化のステータスを再確認してください。再テストを行うには、ウェブサイトの「キャッシュをクリア」リンクをクリックしてください。

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

それで決まりです!あなたのApacheサーバーがCentOS/RHELシステム上で動作しており、無料のLet’s Encrypt SSL証明書を使用してSSLコンテンツを提供しています。

関連記事: