3. メンテナンス・トラブルシュート - メールサーバ - 証明書を使用する

 
3.1 概要
3.2 証明書作成
3.3 無料の証明書を取得
3.4 自動更新スクリプト

3.1 概要

 メールサーバで SSL 接続を行うには、証明書を使用することが条件になります。  自前で証明書を作成する方法と無料の証明書を取得する方法を示します。

3.2 サーバ用証明書作成

 以下に、自前で証明書を作成する方法を示します。

> 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) []:				←	組織名を入力
 []:
Common Name (e.g. server FQDN or YOUR name) []:	←	クライアントに設定するメールサーバ名を入力
Email Address []:								←	サーバ管理者のメールアドレスを入力
 これで
/etc/ssl/mail/cert.pem
 が作成されますので、別のディレクトリに移動してメールサーバ用の証明書とします。

3.3 無料の証明書を取得

 無料の証明書は「Let's Encrypt」より取得します。  これは、ウェブサーバで取得・更新するのと同じ方法で取得できるので「SSL 無料の証明書を取得」を参照してください。  ちょっと工夫が必要なのが tcpserver を使用して SSL 接続を行う場合は、「Let's Encrypt」で発行されたファイルをまとめる必要があります。

> cd /メールサーバが参照する証明書を保存するディレクトリ/
> cat /発行された証明書を保存しているディレクトリ/privkey.pem > cert.pem
> cat /発行された証明書を保存しているディレクトリ/fullchain.pem >> cert.pem
 作成した cert.pem をメールサーバの証明書として使用します。

3.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日の朝確認いたしました。  めでたく、証明書が更新されておりました。