DovecotのSSLエラー

2021/9/30になって、iPadで自宅のメールサーバーからメールを取り出せなくなりました。
Dovecotのログを見ると、

Oct  2 15:23:18 gentoo dovecot[24406]: pop3-login: Disconnected (no auth attempts in 0 secs): user=<>, rip=0.0.0.0, lip=192.168.0.0, TLS handshaking: SSL_accept() failed: error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown: SSL alert number 46, session=<xxxxxxxxxxxxx>

というようなエラーログが残っていました。

iPadメーラーを強制終了し、再度メーラーを起動すると、

「サーバーの識別情報を検証できません」と表示され、有効期限が「2021/9/30」のようになっています。
詳細を確認しても、サーバ証明書の有効期限は2021/11/18とまだ先です。
どうやらこれは、古いルート証明書「DST Root CA X3」の期限が2021/9/30までだからのようです。
古いOSで問題になるようですが、しかし、iPadは先日iOS15にしたばかり。
iOSの問題かと思ったのですが・・・。

なんと、Galaxy S20にあっては、7月からエラーでメールが取得できていなかった模様。
Galaxy S20はセキュリティタイプを「SSL(すべての証明書を許可)」という設定にすると、メールを取得し始めました。

Let's Encryptで「DST Root CA X3」ではなく、新しいルート証明書「ISRG Root X1」を使うように、強制的に更新してみました。

gentoo # certbot renew --force-renewal --preferred-chain "ISRG Root X1"
gentoo # /etc/init.d/dovecot restart

これをやっても、iPadメーラーは取得しに行かず、エラーログも変わりません。

いろいろと試してみましたが、Dovecotのconfが間違っているのかなぁ、と思い、初心に帰ってLet's Encryptを使った10-ssl.confを書いている人のサイトを見てみると、間違いを発見!!

ssl = yes
ssl_cert = </etc/letsencrypt/live/nns-fact.2y.net/cert.pem
ssl_key = </etc/letsencrypt/live/nns-fact.2y.net/privkey.pem

このssl_certに、中間証明書を含めないサーバー証明書「cert.pem」を指定していたため、iPadもGalaxy S20もルート証明書が「DST Root CA X3」だと思い、エラーが出ていたようです。
中間証明書を含む証明書に変更します。

ssl = yes
ssl_cert = </etc/letsencrypt/live/nns-fact.2y.net/fullchain.pem
ssl_key = </etc/letsencrypt/live/nns-fact.2y.net/privkey.pem

これで、iPadから無事にメールを取得でき、Galaxy S20もセキュリティタイプを「SSL(すべての証明書を許可)」から「SSL」に戻してもエラーが出なくなりました。

めでたしめでたし。