【Postfix】PostfixでTLS通信を設定してみる

こんにちは

今回は Postfix でTLS通信を設定してみたので、それの備忘録となります。
なお、環境は Vagrant を利用した完全ローカル環境で、ほとんどPostfixの設定はこちらの記事とほとんど同じです。
また、今回利用する証明書は自己署名証明書(オレオレ証明書)を利用するので、通信経路上の暗号化は可能ですが、送信元のなりすまし防止には役立ちません。
※本番環境では必ず認証局が発行した証明書を利用してください

 

▼PostfixのTLS通信について
まず最初に、PostfixにおけるTLS通信について簡単に説明します。
メール技術では送受信における暗号化の仕組みがなく、そのままでは簡単にメールの中身を第三者に盗み見られてしまいます。
そのため、PostfixなどではSTARTTLSを用いて、データの暗号化を実装し、メールの盗聴や改ざん対策としています。
また、2024年2月からGoogleはメール送信者に対してTLS接続の使用を義務化しており、TLS接続なしではGmailが届かなくなっております。
このように現在では全世界規模でメール暗号化が推進されている状況となります。

 

それでは、簡単な説明も終わったので、ここからは実際の設定に進んでいきます。

 

▼環境

※OSは両方とも AlmaLinux9 です

サーバー1:メール送信側、IP:192.168.33.95、ドメイン名:mail01.mailtest.com

サーバー2:メール受信側、IP:192.168.33.96、ドメイン名:mailclient01.mailtest.com

 

ローカル環境でメールの送受信を可能にするため、両方のサーバーで下記ローカルの名前解決を設定します

cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.33.95 mail01.mailtest.com
192.168.33.96 mailclient01.mailtest.com

 

▼メール送信経路

サーバー1のPostfixからメール送信

サーバー1の /etc/hosts で名前解決

サーバー2のPostfixで受信

 

▼流れ

1. サーバー1からメール送信

2. サーバー1でSTARTTLS設定

3. 自己署名証明書(オレオレ証明書)の作成

4. サーバー2でSTARTTLS設定

5. サーバー1からSTARTTLSを利用したメール送信

 

▼手順

1. サーバー1からメール送信

それでは、まずはSTARTTLSの設定なしでそのままメールを送ってみましょう

sendmail -t <<EOL
From: user01@mail01.mailtest.com
To: user02@mailclient01.mailtest.com
Subject: test01
test01
.
EOL

 

/var/log/maillog に下記のように出力されていれば送信できています

Mar 14 09:14:28 dockermail01 postfix/pickup[5190]: EB7E8205BE17: uid=0 from=<root>
Mar 14 09:14:29 dockermail01 postfix/cleanup[5206]: EB7E8205BE17: message-id=<20260314091428.EB7E8205BE17@mail01.mailtest.com>
Mar 14 09:14:29 dockermail01 postfix/qmgr[5043]: EB7E8205BE17: from=<root@mailtest.com>, size=323, nrcpt=1 (queue active)
Mar 14 09:14:29 dockermail01 postfix/smtp[5208]: warning: run-time library vs. compile-time header version mismatch: OpenSSL 3.5.0 may not be compatible with OpenSSL 3.2.0
Mar 14 09:14:39 dockermail01 postfix/smtp[5208]: EB7E8205BE17: to=<user02@mailclient01.mailtest.com>, relay=mailclient01.mailtest.com[192.168.33.96]:25, delay=11, delays=0.2/0.16/10/0.23, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as BC65F3E5BE)
Mar 14 09:14:39 dockermail01 postfix/qmgr[5043]: EB7E8205BE17: removed

 

サーバー2でも受信を確認します

宛先ユーザーである user02 のメールボックス内に下記のように入っていればOKです

Return-Path: <root@mailtest.com>
X-Original-To: user02@mailclient01.mailtest.com
Delivered-To: user02@mailclient01.mailtest.com
Received: from mail01.mailtest.com (dockermail01.mailtest.com [192.168.33.95])
        by mailclient01.mailtest.com (Postfix) with ESMTPS id BC65F3E5BE
        for <user02@mailclient01.mailtest.com>; Sat, 14 Mar 2026 09:14:39 +0000 (UTC)
Received: by mail01.mailtest.com (Postfix, from userid 0)
        id EB7E8205BE17; Sat, 14 Mar 2026 09:14:28 +0000 (UTC)
From: user01@mail01.mailtest.com
To: user02@mailclient01.mailtest.com
Subject: test01
Message-Id: <20260314091428.EB7E8205BE17@mail01.mailtest.com>
Date: Sat, 14 Mar 2026 09:14:28 +0000 (UTC)

test01

 

2. サーバー1でSTARTTLS設定

サーバー1でSTARTTLSを設定します

vi /etc/postfix/main.cf
smtp_tls_security_level = may
smtp_tls_loglevel = 2

→ smtp_tls_security_level がSTARTTLSに関する項目であり、値を may とすることで、

受信側がTLS通信に対応していれば送信側もTLS通信通信を利用し、対応していなければそのまま暗号化せずにメールを送信します

 

Postfixでシンタックスチェックをします

postfix check

→ 何も出力されなければOKです

 

postfix を再起動します

systemctl restart postfix

 

3. 自己署名証明書(オレオレ証明書)の作成

次に、受信側で利用する自己署名証明書(オレオレ証明書)を作成します

※自己署名証明書は公のインターネット上では利用できず、あくまで社内などのローカル環境で利用するためのものとなっているので注意してください

 

保管先のディレクトリの作成

mkdir -p /etc/ssl/tls

 

証明書の作成

sudo openssl req -new -x509 -days 365 -nodes \
-out /etc/ssl/tls/server-cert.pem \
-keyout /etc/ssl/tls/server-key.pem
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:mailclient01.mailtest.com
Email Address []:

→ いろいろと聞かれますが、今回はCommon Name(ドメイン名)のみ記入します

 

下記のように tls ディレクトリ配下に証明書と秘密鍵が作成されていればOKです

# ls -la
total 8
drwxr-xr-x. 2 root root   51 Mar 14 09:30 .
drwxr-xr-x. 3 root root   88 Mar 14 09:26 ..
-rw-r--r--. 1 root root 1334 Mar 14 09:30 server-cert.pem
-rw-------. 1 root root 1704 Mar 14 09:28 server-key.pem

 

4. サーバー2でSTARTTLS設定

作成した証明書と秘密鍵を受信側のPostfixで指定します

vi /etc/postfix/main.cf
smtpd_tls_cert_file = /etc/ssl/tls/server-cert.pem
smtpd_tls_key_file = /etc/ssl/tls/server-key.pem
smtp_tls_security_level = may
smtp_tls_loglevel = 2

 

Postfixでシンタックスチェックをします

postfix check

→ 何も出力されなければOKです

 

postfix を再起動します

systemctl restart postfix

 

5. サーバー1からSTARTTLSを利用したメール送信

サーバー1で送信確認

Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: setting up TLS connection to mailclient01.mailtest.com[192.168.33.96]:25
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: mailclient01.mailtest.com[192.168.33.96]:25: TLS cipher list "aNULL:-aNULL:HIGH:MEDIUM:+RC4:@STRENGTH"
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: SSL_connect:before SSL initialization
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: SSL_connect:SSLv3/TLS write client hello
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: SSL_connect:SSLv3/TLS write client hello
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: SSL_connect:SSLv3/TLS read server hello
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: SSL_connect:TLSv1.3 read encrypted extensions
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: mailclient01.mailtest.com[192.168.33.96]:25: depth=0 verify=0 subject=/C=XX/L=Default City/O=Default Company Ltd/CN=mailclient01.mailtest.com
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: mailclient01.mailtest.com[192.168.33.96]:25: depth=0 verify=1 subject=/C=XX/L=Default City/O=Default Company Ltd/CN=mailclient01.mailtest.com
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: SSL_connect:SSLv3/TLS read server certificate
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: SSL_connect:TLSv1.3 read server certificate verify
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: SSL_connect:SSLv3/TLS read finished
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: SSL_connect:SSLv3/TLS write change cipher spec
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: SSL_connect:SSLv3/TLS write finished
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: mailclient01.mailtest.com[192.168.33.96]:25: subject_CN=mailclient01.mailtest.com, issuer_CN=mailclient01.mailtest.com, fingerprint=F6:A9:1E:84:45:8F:35:F0:EA:67:7D:87:9D:82:57:93, pkey_fingerprint=CC:E6:C0:B6:5D:D6:17:68:9F:F6:82:EF:27:D6:26:D2
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: Untrusted TLS connection established to mailclient01.mailtest.com[192.168.33.96]:25: TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: SSL_connect:SSL negotiation finished successfully
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: SSL_connect:SSL negotiation finished successfully
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: SSL_connect:SSLv3/TLS read server session ticket
Mar 14 10:08:40 dockermail01 postfix/smtp[6004]: 0F148205BE2E: to=<user02@mailclient01.mailtest.com>, relay=mailclient01.mailtest.com[192.168.33.96]:25, delay=11, delays=0.16/0.23/10/0.09, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 7806D3E5BD)
Mar 14 10:08:40 dockermail01 postfix/qmgr[5999]: 0F148205BE2E: removed

→ 自己署名証明書を利用しているため、Untrusted TLS connection established にはなっていますが、通信の暗号化自体には成功してそうです

 

サーバー2で受信確認

Mar 14 10:10:01 mailclient01 postfix/postfix-script[4711]: starting the Postfix mail system
Mar 14 10:10:01 mailclient01 postfix/master[4713]: daemon started -- version 3.5.25, configuration /etc/postfix
Mar 14 10:10:15 mailclient01 postfix/smtpd[4716]: warning: run-time library vs. compile-time header version mismatch: OpenSSL 3.5.0 may not be compatible with OpenSSL 3.2.0
Mar 14 10:10:15 mailclient01 postfix/smtpd[4716]: connect from mail01.mailtest.com[192.168.33.95]
Mar 14 10:10:15 mailclient01 postfix/smtpd[4716]: DABBA3E366: client=mail01.mailtest.com[192.168.33.95]
Mar 14 10:10:15 mailclient01 postfix/cleanup[4720]: DABBA3E366: message-id=<20260314101005.573BB205BE2E@mail01.mailtest.com>
Mar 14 10:10:15 mailclient01 postfix/qmgr[4715]: DABBA3E366: from=<root@mailtest.com>, size=544, nrcpt=1 (queue active)
Mar 14 10:10:15 mailclient01 postfix/smtpd[4716]: disconnect from mail01.mailtest.com[192.168.33.95] ehlo=2 starttls=1 mail=1 rcpt=1 data=1 quit=1 commands=7
Mar 14 10:10:15 mailclient01 postfix/local[4721]: DABBA3E366: to=<user02@mailclient01.mailtest.com>, relay=local, delay=0.17, delays=0.12/0.03/0/0.02, dsn=2.0.0, status=sent (delivered to maildir)
Mar 14 10:10:15 mailclient01 postfix/qmgr[4715]: DABBA3E366: removed

→ 少し分かりにくいですが、starttls=1 になっており、1回以上のSSL/TLSハンドシェイクが成功したことが出力されているので、暗号化されたものを受信してそうです

 

★おまけ

おまけとして、送信側のセキュリティレベルを変更してメールを送信するとどうなるのかを残しておきます

 

encrypt: 必ずTLSで送る。相手がTLS非対応なら送らない。自己署名でも暗号化はする。

smtp_tls_security_level = encrypt
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: setting up TLS connection to mailclient01.mailtest.com[192.168.33.96]:25
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: mailclient01.mailtest.com[192.168.33.96]:25: TLS cipher list "aNULL:-aNULL:HIGH:MEDIUM:+RC4:@STRENGTH:!eNULL"
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: SSL_connect:before SSL initialization
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: SSL_connect:SSLv3/TLS write client hello
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: SSL_connect:SSLv3/TLS write client hello
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: SSL_connect:SSLv3/TLS read server hello
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: SSL_connect:TLSv1.3 read encrypted extensions
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: mailclient01.mailtest.com[192.168.33.96]:25: depth=0 verify=0 subject=/C=XX/L=Default City/O=Default Company Ltd/CN=mailclient01.mailtest.com
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: mailclient01.mailtest.com[192.168.33.96]:25: depth=0 verify=1 subject=/C=XX/L=Default City/O=Default Company Ltd/CN=mailclient01.mailtest.com
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: SSL_connect:SSLv3/TLS read server certificate
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: SSL_connect:TLSv1.3 read server certificate verify
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: SSL_connect:SSLv3/TLS read finished
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: SSL_connect:SSLv3/TLS write change cipher spec
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: SSL_connect:SSLv3/TLS write finished
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: mailclient01.mailtest.com[192.168.33.96]:25: subject_CN=mailclient01.mailtest.com, issuer_CN=mailclient01.mailtest.com, fingerprint=F6:A9:1E:84:45:8F:35:F0:EA:67:7D:87:9D:82:57:93, pkey_fingerprint=CC:E6:C0:B6:5D:D6:17:68:9F:F6:82:EF:27:D6:26:D2
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: Untrusted TLS connection established to mailclient01.mailtest.com[192.168.33.96]:25: TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: SSL_connect:SSL negotiation finished successfully
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: SSL_connect:SSL negotiation finished successfully
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: SSL_connect:SSLv3/TLS read server session ticket
Mar 14 10:37:07 dockermail01 postfix/smtp[6195]: BA524205BE17: to=<user02@mailclient01.mailtest.com>, relay=mailclient01.mailtest.com[192.168.33.96]:25, delay=11, delays=0.09/0.1/10/0.24, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 6F4EA3E366)
Mar 14 10:37:07 dockermail01 postfix/qmgr[6190]: BA524205BE17: removed

→ 受信側がTLSに対応しているので、mayと変わらないです

 

verify: 相手の証明書が「信頼できる機関」のもので、かつドメイン名が一致しない限り送信を拒否する。

smtp_tls_security_level = verify
Mar 14 10:40:19 dockermail01 postfix/postfix-script[6210]: stopping the Postfix mail system
Mar 14 10:40:19 dockermail01 postfix/master[6188]: terminating on signal 15
Mar 14 10:40:22 dockermail01 postfix/postfix-script[6286]: starting the Postfix mail system
Mar 14 10:40:22 dockermail01 postfix/master[6288]: daemon started -- version 3.5.25, configuration /etc/postfix
Mar 14 10:40:24 dockermail01 postfix/pickup[6289]: 9EE602042FCB: uid=0 from=<root>
Mar 14 10:40:24 dockermail01 postfix/cleanup[6293]: 9EE602042FCB: message-id=<20260314104024.9EE602042FCB@mail01.mailtest.com>
Mar 14 10:40:24 dockermail01 postfix/qmgr[6290]: 9EE602042FCB: from=<root@mailtest.com>, size=323, nrcpt=1 (queue active)
Mar 14 10:40:24 dockermail01 postfix/smtp[6295]: initializing the client-side TLS engine
Mar 14 10:40:24 dockermail01 postfix/smtp[6295]: warning: run-time library vs. compile-time header version mismatch: OpenSSL 3.5.0 may not be compatible with OpenSSL 3.2.0
Mar 14 10:40:35 dockermail01 postfix/smtp[6295]: setting up TLS connection to mailclient01.mailtest.com[192.168.33.96]:25
Mar 14 10:40:35 dockermail01 postfix/smtp[6295]: mailclient01.mailtest.com[192.168.33.96]:25: TLS cipher list "aNULL:-aNULL:HIGH:MEDIUM:+RC4:@STRENGTH:!aNULL"
Mar 14 10:40:35 dockermail01 postfix/smtp[6295]: SSL_connect:before SSL initialization
Mar 14 10:40:35 dockermail01 postfix/smtp[6295]: SSL_connect:SSLv3/TLS write client hello
Mar 14 10:40:35 dockermail01 postfix/smtp[6295]: SSL_connect:SSLv3/TLS write client hello
Mar 14 10:40:35 dockermail01 postfix/smtp[6295]: SSL_connect:SSLv3/TLS read server hello
Mar 14 10:40:35 dockermail01 postfix/smtp[6295]: SSL_connect:TLSv1.3 read encrypted extensions
Mar 14 10:40:35 dockermail01 postfix/smtp[6295]: mailclient01.mailtest.com[192.168.33.96]:25: depth=0 verify=0 subject=/C=XX/L=Default City/O=Default Company Ltd/CN=mailclient01.mailtest.com
Mar 14 10:40:35 dockermail01 postfix/smtp[6295]: mailclient01.mailtest.com[192.168.33.96]:25: depth=0 verify=1 subject=/C=XX/L=Default City/O=Default Company Ltd/CN=mailclient01.mailtest.com
Mar 14 10:40:35 dockermail01 postfix/smtp[6295]: SSL_connect:SSLv3/TLS read server certificate
Mar 14 10:40:35 dockermail01 postfix/smtp[6295]: SSL_connect:TLSv1.3 read server certificate verify
Mar 14 10:40:35 dockermail01 postfix/smtp[6295]: SSL_connect:SSLv3/TLS read finished
Mar 14 10:40:35 dockermail01 postfix/smtp[6295]: SSL_connect:SSLv3/TLS write change cipher spec
Mar 14 10:40:35 dockermail01 postfix/smtp[6295]: SSL_connect:SSLv3/TLS write finished
Mar 14 10:40:35 dockermail01 postfix/smtp[6295]: certificate verification failed for mailclient01.mailtest.com[192.168.33.96]:25: self-signed certificate
Mar 14 10:40:35 dockermail01 postfix/smtp[6295]: mailclient01.mailtest.com[192.168.33.96]:25: subject_CN=mailclient01.mailtest.com, issuer_CN=mailclient01.mailtest.com, fingerprint=F6:A9:1E:84:45:8F:35:F0:EA:67:7D:87:9D:82:57:93, pkey_fingerprint=CC:E6:C0:B6:5D:D6:17:68:9F:F6:82:EF:27:D6:26:D2
Mar 14 10:40:35 dockermail01 postfix/smtp[6295]: Untrusted TLS connection established to mailclient01.mailtest.com[192.168.33.96]:25: TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256
Mar 14 10:40:35 dockermail01 postfix/smtp[6295]: 9EE602042FCB: to=<user02@mailclient01.mailtest.com>, relay=mailclient01.mailtest.com[192.168.33.96]:25, delay=11, delays=0.17/0.24/10/0, dsn=4.7.5, status=deferred (Server certificate not trusted)

→ 自己署名証明書なので certificate verification failed となっており、status=deferred で 送信が失敗しています

 

▼まとめ
いかがでしたでしょうか?
割とシンプルにTLS化できたのではないかと思います。
また、記事を書く過程で改めてそれぞれの設定値を調べたりしたので、それもいい勉強になりました。
ただ、今回は横着して自己署名証明書を利用したので、次はLet’s Encrypt などのCA証明書を利用してやってみたいかなとも思いました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA