無料でサーバ証明書を取得できるLet's Encryptを使って、これまでに作ったWebサーバやメールサーバをSSL化してみる。
Let's Encryptでサーバ証明書を取得するために80番ポートを開放する
Webサーバ(Apache)が動作している場合は下記コマンドで停止させる。
sudo systemctl stop apache2
Webサーバ等を動作させていない場合は下記コマンドで80番ポートを開放する。
upnpc -a `upnpc -l | sed -n -e "s/Local LAN ip address : //p"` 80 80 TCP
Let's Encryptでサーバ証明書を取得する
Let's Encrypt 総合ポータル(日本語)から「Let's Encrypt の使い方」→「Certbot クライアントの準備」の「1. インストール」から「その他の UNIX 系 OS」にある手順に従い、下記コマンドでサーバ証明書を取得する。
cd /usr/local/bin sudo wget https://dl.eff.org/certbot-auto sudo chmod a+x certbot-auto cd sudo /usr/local/bin/certbot-auto certonly -m hogehoge@gmail.com -d example.mydns.jp --standalone -n --agree-tos
サーバ証明書を既に取得していて再インストールを行いたい場合は上記の末尾1行を下記のように入力する。
sudo /usr/local/bin/certbot-auto certonly -m hogehoge@gmail.com -d example.mydns.jp --standalone -n --agree-tos --reinstall
Let's Encryptでサーバ証明書を取得したので80番ポートを閉鎖する
Webサーバ(Apache)を動作させていた場合は下記コマンドで再起動させる。
sudo systemctl start apache2
Webサーバ等を動作させていなかった場合は下記コマンドで80番ポートを閉鎖する。
upnpc -d 80 TCP
サーバ証明書の自動更新
下記コマンドでサーバ証明書を自動更新するためのcronジョブを登録する。毎日2回(0:00と12:00)に実行される。サーバ証明書の更新前と更新後にメールサーバのPostfix、DovecotとWebサーバのApacheを停止および起動するためのコマンドを--pre-hookオプションと--post-hookオプションで指定している。
sudo sh -c 'echo '\''0 0,12 * * * root /usr/local/bin/certbot-auto renew --quiet --pre-hook "systemctl stop postfix;systemctl stop dovecot;systemctl stop apache2" --post-hook "systemctl start apache2;systemctl start dovecot;systemctl start postfix"'\'' > /etc/cron.d/certbot'
SSLでのメール送信のために465番と993番と995番ポートを開放する
下記コマンドで既に作成したポート開放スクリプトにSMTPS(465番ポート)、IMAP4S(993番ポート)、POP3S(995番ポート)のポート番号を追加する。
sudo sed -i -e 's/for port in \([0-9 ]*\); do/for port in \1 465 995 993; do/' /usr/local/bin/mydnsupdate.sh
メールサーバのSSL化
下記コマンドでDovecotのSSL有効化とサーバ証明書の設定、PostfixのSSL有効化とサーバ証明書の設定、PostfixのSMTPSポートの有効化を行い、DovecotとPostfixを再起動する。
sudo sed -i -e 's/^ssl = no/ssl = yes/' /etc/dovecot/conf.d/10-ssl.conf sudo sed -i -e 's/^#ssl_cert = <\/etc\/dovecot\/dovecot\.pem/ssl_cert = <\/etc\/letsencrypt\/live\/example.mydns.jp\/fullchain\.pem/' /etc/dovecot/conf.d/10-ssl.conf sudo sed -i -e 's/^#ssl_key = <\/etc\/dovecot\/private\/dovecot\.pem/ssl_key = <\/etc\/letsencrypt\/live\/example.mydns.jp\/privkey\.pem/' /etc/dovecot/conf.d/10-ssl.conf sudo sed -i -e 's/^smtpd_tls_cert_file=\/etc\/ssl\/certs\/ssl-cert-snakeoil\.pem/smtpd_tls_cert_file=\/etc\/letsencrypt\/live\/example.mydns.jp\/fullchain.pem/' /etc/postfix/main.cf sudo sed -i -e 's/^smtpd_tls_key_file=\/etc\/ssl\/private\/ssl-cert-snakeoil\.key/smtpd_tls_key_file=\/etc\/letsencrypt\/live\/example.mydns.jp\/privkey.pem/' /etc/postfix/main.cf sudo sh -c 'echo "smtpd_tls_security_level = may" >> /etc/postfix/main.cf' sudo sed -i -e '/^#smtps /,/^#628 /s/^# -o smtpd_tls_wrappermode=yes/ -o smtpd_tls_wrappermode=yes/' /etc/postfix/master.cf sudo sed -i -e '/^#smtps /,/^#628 /s/^# -o smtpd_sasl_auth_enable=yes/ -o smtpd_sasl_auth_enable=yes/' /etc/postfix/master.cf sudo sed -i -e '/^#smtps /,/^#628 /s/^# -o smtpd_client_restrictions=$mua_client_restrictions/ -o smtpd_client_restrictions=$mua_client_restrictions/' /etc/postfix/master.cf sudo sed -i -e '/^#smtps /s/^#//' /etc/postfix/master.cf sudo systemctl restart dovecot sudo systemctl reload postfix
- ※/etc/dovecot/conf.d/10-ssl.confの「ssl = no」を「ssl = yes」、「#ssl_cert =
- ※/etc/postfix/main.cfに「smtpd_tls_security_level = may」を追加し、「smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem」を「smtpd_tls_cert_file=/etc/letsencrypt/live/example.mydns.jp/fullchain.pem」、「smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key」を「smtpd_tls_key_file=/etc/letsencrypt/live/example.mydns.jp/privkey.pem」に書き換える。
- ※/etc/postfix/master.cfの「#smtps inet…」から「# -o milter_macro_daemon_name=…」の間にある「#smtps inet…」と「# -o smtpd_tls_wrappermode=…」と「# -o smtpd_sasl_auth_enable=…」と「# -o smtpd_client_restrictions=…」のコメント化を解除する。
HTTPSポートの開放
下記コマンドで既に作成したポート開放スクリプトにHTTPS(443番ポート)のポート番号を追加する。
sudo sed -i -e 's/for port in \([0-9 ]*\); do/for port in \1 443; do/' /usr/local/bin/mydnsupdate.sh
WebサーバをSSL化する
下記コマンドでApacheのSSL設定ファイルにサーバ証明書を設定して、SSL設定ファイル有効化とSSLモジュール有効化を行い、Apacheを再起動する。
sudo sed -i -e 's/SSLCertificateFile.*/SSLCertificateFile \/etc\/letsencrypt\/live\/example.mydns.jp\/fullchain.pem/' /etc/apache2/sites-available/default-ssl.conf sudo sed -i -e 's/SSLCertificateKeyFile.*/SSLCertificateKeyFile \/etc\/letsencrypt\/live\/example.mydns.jp\/privkey.pem/' /etc/apache2/sites-available/default-ssl.conf sudo a2ensite default-ssl sudo a2enmod ssl sudo systemctl restart apache2
- ※/etc/apache2/sites-available/default-ssl.confの「SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem」を「SSLCertificateFile /etc/letsencrypt/live/example.mydns.jp/fullchain.pem」に、「SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key」を「SSLCertificateKeyFile /etc/letsencrypt/live/example.mydns.jp/privkey.pem」に書き換える。
- ※SSL関連の標準的な環境変数をCGI/SSIで使用できるように/etc/apache2/sites-available/default-ssl.confのSSLOptionsで定義されているので必要に応じて拡張子や対象ディレクトリを書き換える。