CentOS7のApacheでSSL通信

前回はApacheをインストールし、Webページが表示できるようになるところまでできました。こんばんわ、Web担当 神凪です。
今回はSSL通信できるように設定変更し、安全な通信を確立させます。
そのために必要になるのが証明書ですが、これはCertBotで作成してもらうことにします。 自作サーバ証明書、所謂オレオレ証明書は・・・ちょっと・・・。

目標

  • サーバ証明書を発行する
  • Apacheに証明書を組み込み、SSL通信ができるようにする

環境

  • CentOS 7.3
  • Apache/2.4.6

準備

  • Apacheがインストールされていること

手順

Certbot関連

まずはCertbotクライアントをインストールし、証明書の発行及び更新を自動で行えるようにします。

Certbotクライアントのインストール

cd /usr/local
git clone https://github.com/certbot/certbot
cd
/usr/local/certbot/certbot-auto -n

サーバ証明書の取得

/usr/local/certbot/certbot-auto certonly --webroot -w <<ドキュメントルート>> -m <<メールアドレス>> -d <<Webサーバー名>> --agree-tos

それぞれのパラメータは、NCEではこのようにしています。
ドキュメントルート⇒/var/www/html/
メールアドレス⇒nceadmin@203.104.204.125(任意のアドレス)
Webサーバー名⇒www.netcircus.jp(https://***/ の***部分)

実行後、「IMPORTANT NOTES」が表示されれば正しく作成が完了です。
NOTESの情報に証明書の保存場所や有効期限が書かれています。

Apache関連

証明書の準備ができましたので、続いてApacheに設定を行います。

mod_sslインストール

yum -y install mod_ssl

Apache設定

vi /etc/httpd/conf.d/ssh.conf

以下の内容に変更します。
SSL Version2及びVersion3のみ無効化し、常時HTTPS接続するための設定になります。

SSLProtocol all -SSLv2 -SSLv3

SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
SSLHonorCipherOrder on

ErrorLog logs/ErrorLog
CustomLog logs/access_log combined env=!no_log
LogLevel warn

SSLCertificateFile /etc/letsencrypt/live/www.netcircus.jp/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.netcircus.jp/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.netcircus.jp/chain.pem

Header always set Strict-Transport-Security "max-age=15768000"
</VirtualHost>

設定反映

設定した内容を反映します。

systemctl reload httpd

サーバ証明書自動更新設定

上にも書きましたが、Certbotのサーバ証明書は有効期限があります。
毎月自動でサーバ証明書を更新するようにしましょう

cat << EOF > /etc/cron.monthly/certbot
#!/bin/sh
log=`mktemp`
code=0

# 証明書更新
for conf in `ls /etc/letsencrypt/renewal/`
do
    # ドメイン名取得
    domain=`echo ${conf}|sed -e 's/\([^ ]*\)\.conf/\1/p' -e d`

    # 認証方式取得
    authenticator=`grep authenticator /etc/letsencrypt/renewal/${conf}|awk '{print $3}'`

    if [ ${authenticator} = 'webroot' ]; then
        # Web認証の場合

        # ドキュメントルート取得
        webroot=`grep -A 1 webroot_map  /etc/letsencrypt/renewal/${conf}|grep =|awk '{print $3}'`

        # 証明書更新
        /usr/local/certbot/certbot-auto certonly --webroot \
        -w ${webroot} -d ${domain} --renew-by-default >> ${log} 2>&1
        [ $? -ne 0 ] && cat ${log}
    else
        # スタンドアロン認証の場合

        # 証明書更新
        lsof -i:80 > /dev/null 2>&1
        if [ $? -eq 0 ]; then
            echo 'Webサーバー稼働中のためスタンドアロン認証不可'
        else
            /usr/local/certbot/certbot-auto certonly -a standalone \
            -d ${domain} --renew-by-default >> ${log} 2>&1
            [ $? -ne 0 ] && cat ${log}
        fi
    fi
done

#
# 証明書更新反映
#

# Webサーバー設定再読込み
lsof -i:443 > /dev/null 2>&1
if [ $? -eq 0 ]; then
    rpm -q systemd > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        systemctl reload httpd
    else
        /etc/rc.d/init.d/httpd reload > /dev/null 2>&1
    fi
fi

# SMTPサーバー設定再読込み
lsof -i:465 > /dev/null 2>&1
if [ $? -eq 0 ]; then
    rpm -q systemd > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        systemctl reload postfix
    else
        /etc/rc.d/init.d/postfix reload > /dev/null 2>&1
    fi
fi

# IMAPサーバー設定再読込み
lsof -i:995 > /dev/null 2>&1
if [ $? -eq 0 ]; then
    rpm -q systemd > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        systemctl reload dovecot
    else
        /etc/rc.d/init.d/dovecot reload > /dev/null 2>&1
    fi
fi

#
# ログをsyslogへ出力後削除
#
cat ${log}|logger -t `basename ${0}` ; rm -f ${log}

EOF

chmod +x /etc/cron.monthly/certbot

まとめ

以上で常時HTTPS接続となる設定が反映されました。
一応この証明書、Webサーバだけでなくメールサーバでも使用しますので、メールサーバ側のreloadが組み込んであります。
必要なければ削除してくださいね

  • HTTPS接続ができるようになった
  • 常時HTTPS接続できるようになった
  • 証明書はCertbotに発行してもらう
  • 証明書は毎月更新する

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください