Raspberry Piで作ったサーバをSSL化する

無料でサーバ証明書を取得できる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
  • ※hogehoge@gmail.comの部分は受信可能なメールアドレス、example.mydns.jpはMyDNS.JPで設定したドメイン名に置き換える。

Let's Encryptでサーバ証明書を取得したので80番ポートを閉鎖する

Webサーバ(Apache)を動作させていた場合は下記コマンドで再起動させる。

sudo systemctl start apache2

Webサーバ等を動作させていなかった場合は下記コマンドで80番ポートを閉鎖する。

upnpc -d 80 TCP

サーバ証明書の自動更新

下記コマンドでサーバ証明書を自動更新するためのcronジョブを登録する。毎日2回(0:00と12:00)に実行される。サーバ証明書の更新前と更新後にメールサーバのPostfixDovecotと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

下記コマンドでDovecotSSL有効化とサーバ証明書の設定、PostfixSSL有効化とサーバ証明書の設定、PostfixのSMTPSポートの有効化を行い、DovecotPostfixを再起動する。

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化する

下記コマンドでApacheSSL設定ファイルにサーバ証明書を設定して、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で定義されているので必要に応じて拡張子や対象ディレクトリを書き換える。