PostfixでTLSするのにはまった話

# はじめに
　sendmailにかわり、SMTPサーバとして利用されているPostfix。今回は、PostfixのTLS化の話しです。
 ただし、自分にくるSMTPをTLS化する話はおいておいて、組織内にあるリレーホストがTLSもしくはSMTPSしか受け付けてくれないので、自分のSMTPサーバからリレーホストに対してTLS接続する設定を入れてやる必要がありました。
 
# PostfixでTLSの設定する
　送信時のTLS化のみ設定します。そのため、非常に設定はシンプルで、/etc/postfix/main.cfに次の行を足します。（Rockey Linux9です）
 ```
smtp_tls_security_level = may　=>　相手がTLSに対応してればTLS使う
smtp_tls_loglevel = 1 =>　ログの取得レベルは1にする
 ```
 と設定を変更した後に
 ```
 smtp_server # systemctl restart postfix
 ```
でPostfixを再起動し、設定をリロードしています。
ちなみにログの取得レベルは次のようになっています。
| Log Level |  |
|:-:|:-:|
| 0 | TLSに関するログを取得しない  |
| 1 | TLSハンドシェイクと証明書を記録する  |
| 2 | TLSネゴシエーション間のプロセスを記録する  |
| 3 | TLSネゴシエーションプロセスのHEX/ASCIIを記録します  |
| 4 | STARTTLS以降の動作をすべて記録する |

# テストメールを送信する
さて、ここで送信テストです。
ひとまずmailxコマンドで・・・と思ったらNot Found...。
dnf searchしてもmailxコマンドはありませんでした。
そこで代わり（後継）をするのがs-nail！
早速インストールです。
```
smtp-server $ sudo dnf install s-nail
```
はい、これでmailx使えるようになりました。
そこで、早速テストメール送ってみます。
```
smtp-server $ echo 'TEST Mail'|mailx -s '<Subjext>' <送信先アドレス>
```
メールボックスを確認して、届いているか見てみましょう。
同時にログでちゃんとTLS暗号化されているか見てみましょう。

# ログで確認
ログを見てみましょう
```
Apr 16 **:59:00 mail postfix/pickup[85888]: 4199E41D3F: uid=1003 from=<user01>
Apr 16 **:59:00 mail postfix/cleanup[86122]: 4199E41D3F: message-id=<20240416**5900.4199E41D3F@mail.domain.local.jp>
Apr 16 **:59:00 mail postfix/qmgr[85889]: 4199E41D3F: from=<user01@mail.domain.local.jp>, size=327, nrcpt=1 (queue active)
Apr 16 **:59:00 mail postfix/smtp[86129]: Untrusted TLS connection established to smtp.domain.local.jp[172.16.0.151]:25: TLSv1.
2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
Apr 16 **:59:00 mail postfix/smtp[86129]: 4199E41D3F: to=<test@local.jp>, relay=smtp.domain.local.jp[172.16.0.151]:25, dela
y=0.58, delays=0/0.02/0.36/0.2, dsn=2.0.0, status=sent (250 Message queued for delivery as ca23452e64)
Apr 16 **:59:00 mail postfix/qmgr[85889]: 4199E41D3F: removed
```
よしよし、送れてる。って、”Untrusted TLS”と記録されてる。
ネットで探すと、
・証明書の検証ができていない／失敗している
・証明書のホスト名と接続先のホスト名が違う
場合にUntrustedとなるようだ。
リレーホストに入れている証明書は中間証明書がいるもののroot証明局の署名が入った正しいもの。接続先のホスト名もログに記録されているものと一致している。
ということは検証ができていないことが原因っぽい

そこでログレベルを3にして再度テストしたところ、相手から証明書も正しく取得しているし、検証に必要な証明書Chainも一緒に貰っているようだ。
さらに調べたところ、smtp_tls_CAfileにCA認証局の証明書を指定すると検証ができるという情報が。
しかし、ここで中間証明書を指定してもダメ、自分のサーバの証明書を指定してもダメ、どうするか・・・。

OSにバンドルされているCA証明書があるので、それを指定するといいという情報を得たので

```
smtp_server $ sudo dnf install ca-certificates
```
とすると/etc/pki/tls/certsにCA認証局の証明書がインストールされる。
そこで、/etc/postfix/main.cfに
```
smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
```
と設定後、Postfixを再起動して、テストメールを送信すると
```
Apr 18 **:52:21 mail postfix/pickup[88757]: 7CBEF41D3F: uid=1003 from=<user01>
Apr 18 **:52:21 mail postfix/cleanup[88763]: 7CBEF41D3F: message-id=<20240418**5221.7CBEF41D3F@mail.domain.local.jp>
Apr 18 **:52:21 mail postfix/qmgr[88758]: 7CBEF41D3F: from=<user01@mail.domain.local.jp>, size=328, nrcpt=1 (queue active)
Apr 18 **:52:21 mail postfix/smtp[88765]: Trusted TLS connection established to smtpmail.domain.local.jp[172.16.0.151]:25: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
Apr 18 **:52:22 mail postfix/smtp[88765]: 7CBEF41D3F: to=<test@local.jp>, relay=smtpmail.domain.local.jp[172.16.0.151]:25, delay=0.54, delays=0.01/0.05/0.32/0.16, dsn=2.0.0, status=sent (250 Message queued for delivery as aa8bdaa078)
Apr 18 **:52:22 mail postfix/qmgr[88758]: 7CBEF41D3F: removed
```
無事にTrustedなTLSで接続ができました。

# まとめ
結局のところ、
・mailxはs-nailが後継
・PostfixのリレーホストにTLSで接続するには、smtp_tls_CAfileでルート証明書の場所を指定する
という感じでした。