自己証明書を利用したメールサーバーのSSL化

前回、紹介したメールサーバーの構築は、最低限の設定だけでした。今回は、暗号化対応を行い、パスワードやメール本文の盗聴に備えます。(※ 暗号化が保証されるのは、自宅サーバーとメールクライアント(MUA) 間のみです。MTA 間の通信は、相手の SMTP サーバーが STARTTLS 対応している場合に実施されます。)

今回は自己証明書(オレオレ証明書)を使って、チャチャっと暗号化を行うための記事です。前回の設定をベースに追加設定のみ記載します。ベースにしているPostfixとDovecotの設定は、以下の記事を参照してください。

本記事では CentOS 7 をインストールすると最初から入っている Postfix を利用してメールサーバー(SMTP サーバー)を構築する方法を紹介します。MUA (POP...

なお、自己証明書の場合、メーラーで送受信する際に、証明書の検証をしないように、設定する必要があります。例えば、手元にあるスマホにインストールされている gmail (ver. 8.10.21) の設定では、「SSL/TLS (証明書をすべて承認)」を設定しておく必要があります。

Let’s Encrypt を利用した、ドメイン認証(DV)証明書を利用する方法は別途以下の記事で紹介しています。

前回は、自己証明書で暗号化(SSL化)を進めましたが、MUAによっては証明書検証でエラーが出ることがあるため、問題となる場合があります。そのため、今回は、Let's Encry...

メールサーバーを構築するにあたり、SMTP認証やメール(SMTP)の暗号化などの概要を理解したい方は以下を参考にしてください。

私は qmail で POP before SMTP という古い仕組みを使い続けていたため、SMTP認証とメールの暗号化について理解が曖昧なところがありました。また、Submi...
スポンサーリンク

自己証明書を作成する

自己証明書を作成するには、通常以下の手順が必要です。

  1. サーバー秘密鍵を作成する
  2. サーバー公開鍵を作成する
  3. デジタル証明書を作成する

しかし、CentOS 7.5 でインストールされている openssl のパッケージには、この手順を簡略刺されているMakefileがインストールされているようですので、こちらを利用します。

以下のコマンドを実行し、いくつか対話するだけです。DAYSは、100年有効にしたい場合の例です。(以下では、自身のドメインは example.com として紹介しています。)

# cd /etc/pki/tls/certs/
# make postfix.pem DAYS=36500

以下の対話が始まります。

1
2
3
4
5
6
7
8
9
10
11
12
umask 77 ; \
PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
/usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 36500 -out $PEM2 ; \
~(略)~
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Fukuoka
Locality Name (eg, city) [Default City]:Fukuoka
Organization Name (eg, company) [Default Company Ltd]:Hoge
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:mx.example.com
Email Address []:xxx@xxxx

6行目の Country Name (2 letter code) [XX]: 対話が始まります。

とりあえず作りたい場合は、11行目のCommon Name 以外適当でよいです。わかると思いますがそれぞれ以下の意味になります。

6行目:国名

7行目:都道府県名

8行目:市区町村名 (市でよいでしょう)

9行目:組織名(会社・団体名)

10行目:部門名(会社なら部署名でしょう)

11行目:サーバのFQDN (DNSで引けるMX名)

12行目:メールアドレスを入れます。

このコマンドで、postfix.pem が作成さました。以下のコマンドで、ファイルを移動しておきましょう。

# mkdir /etc/pki/postfix
# mv postfix.pem /etc/pki/postfix/

SELinuxが有効の場合は、system_u のコンテキストが付与されているのが正しい状態ですので、以下のコマンドを打っておきます。(unconfined_uになっていると思います。)

# restorecon -RF /etc/pki/postfix/
# ls -Z /etc/pki/postfix/postfix.pem
-rw-------. root root system_u:object_r:cert_t:s0 /etc/pki/postfix/postfix.pem
このpostfix.pemには、サーバ秘密鍵(key)デジタル証明書(crt)が入っています。以下でmakeファイルを利用せずにデジタル証明書を作成する方法を紹介しています。

自己証明書作成をmakeファイルを使わずに作成する場合

makeファイルを利用せず、サーバー証明書を作成する方法を以下に記載しておきます。

サーバー秘密鍵(key)を作成する

# mkdir /etc/pki/postfix
# cd /etc/pki/postfix/
# openssl genrsa 2048 > server.key

サーバー公開鍵(csr)を作成する。

この時、上記で紹介している対話が入ります。聞かれる内容は上記に加えて、パスワードと会社名が追加されていますが、どちらも任意なので「空」で「Enter」キーを押して問題ありません。

# openssl req -new -key server.key > server.csr

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.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Fukuoka
Locality Name (eg, city) [Default City]:Fukuoka
Organization Name (eg, company) [Default Company Ltd]:Hoge
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:mx.example.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

デジタル証明書(crt)を作成する

openssl x509 -in server.csr -days 365000 -req -signkey server.key > server.crt

以下のコマンドで、サーバー秘密鍵(key)とデジタル証明書(crt)を一つにすると、前述のmakeで作成したファイルと同じになります。

# cat server.key > postfix.pem
# echo "" >> postfix.pem
# cat server.crt >> postfix.pem

PostfixとDovecotへ設定を反映する

それぞれ、デジタル証明書の設定と、SMTPs、POPsやIMAPsのポート設定を行います。

Postfixへの設定

まず、/etc/postfix/main.cf に以下を追記します。秘密鍵とデジタル証明書が一緒になったファイルを利用する場合は、以下の通り同じファイルを設定してください。別々に設定したい場合は名前の通り、smtpd_tls_key_fileにサーバーの秘密鍵(key)、smtpd_tls_cert_fileに、デジタル証明書(crt)を設定しても同じです。

1
2
3
4
smtpd_tls_security_level = may
smtpd_tls_loglevel = 1
smtpd_tls_key_file = /etc/pki/postfix/postfix.pem
smtpd_tls_cert_file = /etc/pki/postfix/postfix.pem
smtpd_tls_security_level = may は、通信先の SMTP サーバーが STARTTLS 対応している場合に暗号化通信をします。未対応の場合は平文で通信します。encrypt にすると TLS 非対応のサーバーに対してメールの送受信ができなくなるので、may にするのが一般的です。
同時にクライアントも平文通信が可能な状態です。MUA 間の通信を暗号化するためには、クライアントを正しく設定する必要があります。

次に、/etc/postfix/master.cf の以下の行のコメントを外し、submission(TCP 587)の暗号化を有効にします。必要に応じて、SMTPs(TCP 465)を有効にしてもよいです。接続するクライアントと要相談です。submission のみまたは、SMTPs のみのクライアントに対応する場合は、必要のない方のセクションをコメントアウトしてポートごと閉じて問題ありません。

1
2
3
4
5
6
7
submission inet n - n - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes

smtps inet n - n - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
smtpd_tls_security_level=encrypt の場合、submission ポートを利用するクライアントは、STARTTLS を送信しない場合エラーとなります。平文も許可する場合は、may を設定します。

以上で、Postfixの設定は完了です。再起動しましょう。

systemctl restart postfix

Dovecotへの設定

まず、/etc/dovecot/conf.d/10-ssl.conf のssl_certssl_keyを変更します。秘密鍵とデジタル証明書が一緒になったファイルを利用する場合は、以下の通り同じファイルを設定します。別々に設定したい場合は名前の通り、ssl_certに、デジタル証明書(crt)を、ssl_key にサーバーの秘密鍵(key)を設定しても同じです。また、SSLv3を無効にしておきます。Postfixは、smtpd_tls_protocolsで同様の設定できますが、デフォルトで無効設定になっているので、明示的に設定は追加していません。

1
2
3
ssl_cert = </etc/pki/postfix/postfix.pem
ssl_key = </etc/pki/postfix/postfix.pem
ssl_protocols = !SSLv2 !SSLv3

次に、/etc/dovecot/conf.d/10-master.conf でPOPsとIMAPsのポート設定を行います。

1
2
3
4
5
6
7
8
9
10
11
・・・
inet_listener imaps {
port = 993
ssl = yes
}
・・・
inet_listener pop3s {
port = 995
ssl = yes
}
・・・

暗号化なしのPOPとIMAPを閉じる場合は、port=0を設定します。

1
2
3
4
5
6
7
8
9
・・・
inet_listener imap {
port = 0
}
・・・
inet_listener pop3 {
port = 0
}
・・・

以上で、Dovecotの設定は完了です。再起動しましょう。

systemctl restart dovecot

ファイヤーウォールの設定

必要に応じて、ファイヤウォールの設定で、SMTPs、POPs、IMAPsの設定を開けます。

firewall-cmd --permanent --zone=public --add-service=smtps
firewall-cmd --permanent --zone=public --add-service=pop3s
firewall-cmd --permanent --zone=public --add-service=imaps
firewall-cmd --reload