Webサーバー間通信内容暗号化にCertbotを導入(CentOS7)

提供:あわ自由帳

メインページ > CentOS 7 で自宅サーバー構築  > Webサーバー間通信内容暗号化にCertbotを導入(CentOS7)

偶にしか行わないので、忘れないように書いておく。

Let's Encrypt から 発行料 無料の SSL/TLS サーバー証明書を取得します。
Let's Encrypt は Linux Foundation の協業プロジェクトで、Web 全体の安全性を改善することをミッションに掲げているとのことです。
発行料 無料 とはいえ、あやしいものではありません。
Let's Encrypt の詳細は公式サイトを参照ください。

Let's Encrypt では 一般的な ドメイン認証 (DV) の証明書を無料で発行しています。
無料ですが Let's Encrypt の中間証明書は、大手認証局 (CA) のルート証明書によってクロス署名されているため、多くの主要ブラウザ等々で信頼済みとして扱われます。
なお、一回の作業で得られる証明書の有効期限は 90日です。よって、90日以内に更新作業を再度実施する必要があります。

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

証明書を取得するためのツール Certbot クライアントをインストールします。

[root@host3 ~]# yum --enablerepo=epel -y install certbot

ドメイン名に対するサーバー証明書取得

Certbotではサーバー名の認証をWeb経由で行うため、サーバー証明書に指定するサーバー名で外部からWebアクセスできるようにしておく必要がある。

ドメイン名に対する SSL/TLS サーバ証明書を取得する場合。

テスト用のサーバ証明書取得

Let's Encrypt 認証局では、ドメイン名あたりの SSL/TLS サーバ証明書の発行枚数について、制限を設けています。そのため、試験段階においては --test-cert オプションを付けて、テスト用のサーバで使ってみることをお勧めします。
※テスト用のサーバで発行したテスト用の証明書は、ブラウザにおいてセキュリティ警告が表示され、信頼された証明書として扱われません。

[root@host3 ~]# certbot certonly --webroot -w /var/www/html/sudachi.jp -d sudachi.jp -m *****@sudachi.jp --test-cert

サーバー証明書取得

[root@host3 ~]# certbot certonly --webroot -w /var/www/html/ -d sudachi.jp -m *****@sudachi.jp --agree-tos
・
・
・
What would you like to do?
-------------------------------------------------------------------------------
1: Keep the existing certificate for now
2: Renew & replace the cert (limit ~5 per 7 days)
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2    ← 2を選択(証明書を更新し、交換する)

複数のドメイン名に対するサーバー証明書取得

Certbotではサーバー名の認証をWeb経由で行うため、サーバー証明書に指定するサーバー名で外部からWebアクセスできるようにしておく必要がある。

複数のドメイン名に対する SSL/TLS サーバ証明書を一度に取得する場合。

サーバー証明書取得

[root@host3 ~]# certbot certonly --webroot -w /var/www/html/sudachi.jp -d sudachi.jp -d mail.sudachi.jp -m *****@sudachi.jp --agree-tos
・
・
・
 IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/sudachi.jp/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/sudachi.jp/privkey.pem
   Your cert will expire on 2019-01-18. 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"
 - 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

バーチャルドメイン名に対するサーバー証明書取得

Certbotではサーバー名の認証をWeb経由で行うため、サーバー証明書に指定するサーバー名で外部からWebアクセスできるようにしておく必要がある。

ドメイン名に対する SSL/TLS サーバ証明書を取得する場合。

サーバー証明書取得

[root@host3 ~]# certbot certonly --webroot -w /var/www/html/awajp.com -d awajp.com -m *****@sudachi.jp --agree-tos
・
・
・
 IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/awajp.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/awajp.com/privkey.pem
   Your cert will expire on 2019-01-18. 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"
 - 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

サーバー証明書設定

Apache設定

SSL設定ファイル編集

[root@host3 ~]# vi /etc/httpd/conf.d/ssl.conf ← SSL設定ファイル編集
#   Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate.  If
# the certificate is encrypted, then you will be prompted for a
# pass phrase.  Note that a kill -HUP will prompt again.  A new
# certificate can be generated using the genkey(1) command.
SSLCertificateFile /etc/letsencrypt/live/sudachi.jp/cert.pem ← 公開鍵指定

#   Server Private Key:
#   If the key is not combined with the certificate, use this
#   directive to point at the key file.  Keep in mind that if
#   you've both a RSA and a DSA private key you can configure
#   both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile /etc/letsencrypt/live/sudachi.jp/privkey.pem ← 秘密鍵指定

#   Server Certificate Chain:
#   Point SSLCertificateChainFile at a file containing the
#   concatenation of PEM encoded CA certificates which form the
#   certificate chain for the server certificate. Alternatively
#   the referenced file can be the same as SSLCertificateFile
#   when the CA certificates are directly appended to the server
#   certificate for convinience.
SSLCertificateChainFile /etc/letsencrypt/live/sudachi.jp/chain.pem ← 中間証明書指定

Apache設定反映

[root@host3 ~]# systemctl reload httpd

メールサーバー設定

Postfix設定

Postfix設定ファイル編集

[root@host3 ~]# vi /etc/postfix/main.cf
#下記を追加
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.sudachi.jp/fullchain.pem ← サーバー証明書+中間証明書を指定
smtpd_tls_key_file = /etc/letsencrypt/live/mail.sudachi.jp/privkey.pem ← 秘密鍵を指定

Postfix再起動

[root@host3 ~]# systemctl restart postfix

Dovecot設定

Dovecot設定ファイル編集

[root@host3 ~]# vi /etc/dovecot/conf.d/10-ssl.conf
・
・
ssl_cert = </etc/letsencrypt/live/mail.centossrv.com/fullchain.pem ← サーバー証明書+中間証明書を指定
ssl_key = </etc/letsencrypt/live/mail.centossrv.com/privkey.pem ← 秘密鍵を指定

Dovecot再起動

[root@host3 ~]# systemctl restart dovecot

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

サーバー証明書自動更新スクリプト作成

[root@host3 ~]# vi /etc/cron.monthly/certbot
#!/bin/bash
log=`mktemp`
code=0

which certbot > /dev/null 2>&1
if [ $? -eq 0 ]; then
    CERTBOT=`which certbot`
else
    CERTBOT=`which certbot-auto`
fi

#
# 証明書更新
#
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 webroot_path /etc/letsencrypt/renewal/${conf}|grep =|awk '{print $3}'|awk -F '[,]' '{print $1}'`

        # 証明書更新
        ${CERTBOT} 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
            ${CERTBOT} certonly -a standalone \
            -d ${domain} --renew-by-default >> ${log} 2>&1
            [ $? -ne 0 ] && cat ${log}
        fi
    fi
    
    # 古い証明書を削除
    find /etc/letsencrypt/archive/${domain}/ -mtime +30 -delete
    
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}

サーバー証明書自動更新スクリプトへ実行権限付加

[root@host3 ~]# chmod +x /etc/cron.monthly/certbot

ファイルの場所

設定ファイルの場所

[root@host3 ~]# ll /etc/letsencrypt/renewal/
合計 4
-rw-r--r-- 1 root root 629 10月 20 13:15 sudachi.jp.conf

証明書の場所(シンボリックリンク)

[root@host3 ~]# ll /etc/letsencrypt/live/
合計 0
drwxr-xr-x 2 root root 88 10月 20 13:15 sudachi.jp 

[root@host3 ~]# ll /etc/letsencrypt/live/sudachi.jp/
合計 4
-rw-r--r-- 1 root root 682 10月 20 13:15 README
lrwxrwxrwx 1 root root  34 10月 20 13:15 cert.pem -> ../../archive/sudachi.jp/cert1.pem
lrwxrwxrwx 1 root root  35 10月 20 13:15 chain.pem -> ../../archive/sudachi.jp/chain1.pem
lrwxrwxrwx 1 root root  39 10月 20 13:15 fullchain.pem -> ../../archive/sudachi.jp/fullchain1.pem
lrwxrwxrwx 1 root root  37 10月 20 13:15 privkey.pem -> ../../archive/sudachi.jp/privkey1.pem

証明書の場所

[root@host3 ~]# ll /etc/letsencrypt/archive/                                                                      
合計 0
drwxr-xr-x 2 root root 152  9月 10 07:52 mail.sudachi.jp


[root@host3 ~]# ll /etc/letsencrypt/archive/mail.sudachi.jp
合計 32
-rw-r--r-- 1 root root 1785  9月 10 03:43 cert1.pem
-rw-r--r-- 1 root root 1805  9月 10 07:52 cert2.pem
-rw-r--r-- 1 root root 1647  9月 10 03:43 chain1.pem
-rw-r--r-- 1 root root 1647  9月 10 07:52 chain2.pem
-rw-r--r-- 1 root root 3432  9月 10 03:43 fullchain1.pem
-rw-r--r-- 1 root root 3452  9月 10 07:52 fullchain2.pem
-rw-r--r-- 1 root root 1708  9月 10 03:43 privkey1.pem
-rw-r--r-- 1 root root 1708  9月 10 07:52 privkey2.pem

設定ファイル

[root@host3 ~]# ll /etc/letsencrypt/
合計 8
drwx------ 5 root root  115  7月 14 03:14 accounts
drwxr-xr-x 3 root root   23 10月 20 13:15 archive
drwxr-xr-x 2 root root 4096 10月 20 13:15 csr
drwx------ 2 root root 4096 10月 20 13:15 keys
drwx------ 3 root root   23 10月 20 13:15 live
drwxr-xr-x 2 root root   28 10月 20 13:15 renewal
drwxr-xr-x 5 root root   40 10月  7  2017 renewal-hooks

証明書を失効させる

最新の certbot コマンドに delete オプションが追加され、まとめてファイルを消せるようになりました。

[root@host3 ~]# certbot delete -d sudachi.xyz
Saving debug log to /var/log/letsencrypt/letsencrypt.log

Which certificate(s) would you like to delete?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: eeljp.net
2: sudachi.xyz
3: sudachinet.jp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 2

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Deleted all files relating to certificate sudachi.xyz.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -