1. 概要
メールサーバで「SSL」接続を行うには、証明書を使用することが条件になります。
自前で証明書を作成する方法と無料の証明書を取得する方法を示します。
2. サーバ用証明書作成
以下に、自前で証明書を作成する方法を示します。
「root」ユーザ権限で。
mkdir -pv /etc/ssl/mail
cd /etc/ssl/mail
openssl req -new -x509 -nodes -out cert.pem -days 366 -keyout cert.pem
以下のように、メッセージ・プロンプトが表示されます。
Generating a 1024 bit RSA private key
...++++++
..........................................................................++++++
writing new private key to 'cert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
JP [JP]: ← JP を入力
State or Province Name (full name) []: ← 都道府県名を入力
Locality Name (eg, city) []: ← 市区町村を入力
Organization Name (eg, company) [Internet Widgits Pty Ltd]: ← 組織名を入力
Organizational Unit Name (eg, section) []: ← 部署名を入力
Common Name (e.g. server FQDN or YOUR name) []: ← クライアントに設定するメールサーバ名を入力
Email Address []: ← サーバ管理者のメールアドレスを入力
これで。
/etc/ssl/mail/cert.pem
が作成されますので、別のディレクトリに移動してメールサーバ用の証明書とします。
3. 無料の証明書を取得
無料の証明書は「Let's Encrypt」より取得します。
これは、ウェブサーバで取得・更新するのと同じ方法で取得できるので「FreeBSD - メンテナンス・トラブルシュート - SSL 無料の証明書を取得」を参照してください。
ちょっと工夫が必要なのが「tcpserver」を使用して「SSL」接続を行う場合は、「Let's Encrypt」で発行されたファイルをまとめる必要があります。
cd /メールサーバが参照する証明書を保存するディレクトリ/
cat /発行された証明書を保存しているディレクトリ/privkey.pem > cert.pem
cat /発行された証明書を保存しているディレクトリ/fullchain.pem >> cert.pem
作成した「cert.pem」をメールサーバの証明書として使用します。
4. 自動更新スクリプト
実は、この記事を書いている時点で、証明書自体は更新されているのです。
メールクライアントに「Thunderbird」を使用しているのですが、証明書をインポートするときに「セキュリティ例外を承認」にしているためか、期限が切れても受信できています。
とはいえ、これはいかん。
更新するスクリプトにしておきます。
もともとの更新スクリプトはこうなっています。
#!/bin/sh
/usr/local/bin/certbot-3.6 \
renew \
--standalone \
--pre-hook "/usr/local/etc/rc.d/apache24 stop" \
--post-hook "/usr/local/etc/rc.d/apache24 start"
これに以下の行を加えます。
F1=/ちゃい1/cert.pem
F2=/ちゃい2/cert.pem
CHANGE=FALSE
if [ ! -f $F1 ]; then
echo "file not found $F1"
exit 1
fi
if [ ! -f $F2 ]; then
echo "file not found $F2"
CHANGE=TRUE
else
if [ $F1 -nt $F2 ]; then
CHANGE=TRUE
fi
fi
if [ $CHANGE = "TRUE" ]; then
cat /ちゃい1/privkey.pem > $F2
cat /ちゃい1/fullchain.pem >> $F2
fi
「ちゃい1」には、「Let's Encrypt」から取得した証明書を保存しているディレクトリがはいります。
「ちゃい2」には、メールサーバ用の証明書を保存しているディレクトリがはいります。
このスクリプトは、夜中に動作するように設定してありますので、明日の朝、動作を確認することとします。
と、上を書いたのが 2018年3月26日で、今、3月27日の朝確認いたしました。
めでたく、証明書が更新されておりました。