Postfix 3.4 [SSL 送受信] CentOS7(マルチドメイン)
↑こちらもご覧ください。記事が新しいです。
今回、無料の証明書発行サービス、「Let’s Encrypt」を利用して、PostfixのTLS(SSL)に対応してみたいと思います。
Let’s Encrypt certbotインストール
amazon linux 2 で、「certbot」をインストールしてみます。
# yum install certbot
と、yumで、cerbotのインストールを行うと、
Installing : certbot-0.27.1-1.el7.noarch ERROR: policydb version 31 does not match my version range 15-30 ERROR: Unable to open policy //etc/selinux/targeted/policy/policy.31. ValueError: Type cert_t is invalid, must be a file or device type
と、エラーになってしまいます。
今回、手動で、certbotをゲットして、実行します。
wget https://dl.eff.org/certbot-auto chmod 700 certbot-auto # ./certbot-auto Sorry, I don't know how to bootstrap Certbot on your operating system! You will need to install OS dependencies, configure virtualenv, and run pip install manually. Please see https://letsencrypt.readthedocs.org/en/latest/contributing.html#prerequisites for more info.
↑エラーになってしまいました。どうも、「Let’s Encrypt」が「amazon linux 2」が対応していないみたい・・・
Amazon Linux 2でLet’s Encryptが使えない
の、ありがたいサイトを参考に、ファイルの中身の一部を書き換えます。
-------------------------------------------------------------------- Bootstrap() { DeprecationBootstrap "macOS" BootstrapMac } BOOTSTRAP_VERSION="BootstrapMac $BOOTSTRAP_MAC_VERSION" elif [ -f /etc/issue ] && grep -iq "Amazon Linux" /etc/issue ; then Bootstrap() { ExperimentalBootstrap "Amazon Linux" BootstrapRpmCommon } -------------------------------------------------------------------- ↓ -------------------------------------------------------------------- Bootstrap() { DeprecationBootstrap "macOS" BootstrapMac } BOOTSTRAP_VERSION="BootstrapMac $BOOTSTRAP_MAC_VERSION" elif grep -i "Amazon Linux" /etc/issue > /dev/null 2>&1 || \ grep 'cpe:.*:amazon_linux:2' /etc/os-release > /dev/null 2>&1; then Bootstrap() { ExperimentalBootstrap "Amazon Linux" BootstrapRpmCommon } --------------------------------------------------------------------
Let’s Encrypt certbotの起動
# ./certbot-auto --debug Bootstrapping dependencies for Amazon... (you can skip this with --no-bootstrap) yum is /usr/bin/yum yum is hashed (/usr/bin/yum) Loaded plugins: extras_suggestions, langpacks, priorities, update-motd amzn2-core | 2.4 kB 00:00 218 packages excluded due to repository priority protections ++++++++++++++++ (略) ++++++++++++++++ Complete! Creating virtual environment... Installing Python packages... Installation succeeded. Saving debug log to /var/log/letsencrypt/letsencrypt.log
↑「Let’s Encrypt」の「certbot」がうまくいったようです。
TLS(SSL)証明書作成
# ./certbot-auto certonly --standalone -d (ホスト名) -m (通知先メールアドレス) --agree-tos -n Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator standalone, Installer None Obtaining a new certificate Performing the following challenges: http-01 challenge for (ホスト名) Cleaning up challenges Problem binding to port 80: Could not bind to IPv4 or IPv6. IMPORTANT NOTES: - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal.
↑エラーが出た。
「certonly –standalone」を指定しているに、httpが起動している(80番ポートが塞がっている)。
「certonly –standalone」のフラグは、certbot内部で、80番ポートを起動して、証明書を取得するというモードなので、既に起動していたら、エラーとなる。ということです・・・
# ps ax |grep http 3676 ? Ss 0:00 /usr/sbin/httpd -DFOREGROUND 3678 ? Sl 0:00 /usr/sbin/httpd -DFOREGROUND 3679 ? Sl 0:00 /usr/sbin/httpd -DFOREGROUND 3680 ? Sl 0:00 /usr/sbin/httpd -DFOREGROUND 3681 ? Sl 0:00 /usr/sbin/httpd -DFOREGROUND 3682 ? Sl 0:00 /usr/sbin/httpd -DFOREGROUND 4145 ? Sl 0:00 /usr/sbin/httpd -DFOREGROUND 4306 pts/0 S+ 0:00 grep --color=auto http
↑httpd(80番ポート)が、起動していた・・
# systemctl stop httpd.servic
と、httpdのサービスを止める。
# ./certbot-auto certonly --standalone -d (ホスト名) -m (通知先メールアドレス) --agree-tos -n Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator standalone, Installer None Obtaining a new certificate Performing the following challenges: http-01 challenge for (ホスト名) Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/(ホスト名)/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/(ホスト名)/privkey.pem Your cert will expire on 2019-XX-XX. To obtain a new or tweaked version of this certificate in the future, simply run certbot-auto again. To non-interactively renew *all* of your certificates, run "certbot-auto 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
↑再度、証明書取得コマンドを発行。成功!
postfix,dovectに証明書ファイルの設定を
vi /etc/postfix/main.cf smtpd_tls_cert_file = /etc/letsencrypt/live/(ホスト名)/fullchain.pem smtpd_tls_key_file = /etc/letsencrypt/live/(ホスト名)/privkey.pem smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache
↑postfix側の証明書を変更する。
vi /etc/dovecot/conf.d/10-ssl.conf ssl_cert = </etc/letsencrypt/live/(ホスト名)/fullchain.pem ssl_key = </etc/letsencrypt/live/(ホスト名)/privkey.pem
↑dovecot側の証明書を変更する
# /etc/rc.d/init.d/dovecot start # /usr/sbin/postfix stop # /usr/sbin/postfix start
↑サービス再起動
グローバル証明書での送受信テスト
>>> Connecting to "(ホスト名)" (SSL/TLS) [2018/XX/XX XX:XX:XX] <<< +OK Dovecot ready. USER (受信メールアドレス) +OK PASS ******** +OK Logged in. STAT +OK 4 3264 LIST +OK 4 messages: 1 647 2 702 3 702 4 1213 . UIDL +OK 1 000000015ba10240 2 000000025ba10240 3 000000035ba10240 4 000000045ba10240 . QUIT +OK Logging out.
↑POP3s(ポート995)OK
>>> Connecting to "(ホスト名)" (SSL/TLS) [2018/XX/XX XX:XX:XX] <<< 220 (ホスト名) ESMTP Postfix EHLO [127.0.0.1] 250-(ホスト名) 250-PIPELINING 250-SIZE 20480000 250-VRFY 250-ETRN 250-AUTH PLAIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN 235 2.7.0 Authentication successful RSET 250 2.0.0 Ok MAIL FROM:<(受信メールアドレス)> 250 2.1.0 Ok RCPT TO:<(送信先メールアドレス)> 250 2.1.5 Ok DATA 354 End data with <CR><LF>.<CR><LF> . 250 2.0.0 Ok: queued as B0A7B2700AB QUIT 221 2.0.0 Bye
↑SMTPs(ポート465) OK