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. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -