ここのところ、Gmailからメールを送信しようとすると、
TLS Negotiation failed, the certificate doesn't match the host., code: 0
なるエラーで送信が出来なくなりました。
なんじゃこりゃ。と思いググっていると、昨年からGmail側のセキュリティが代わり、SSL証明書のコモンネームとSMTPサーバが不一致の場合に発生するとかしないとか。。
対応したこと(一旦はうまく行ったんです。。。)
もしや……と思い、以下でサクッと取得したSSL証明書を利用していたので、
取得時に利用した monmon.jp と www.monmon.jpの同時取得(SAN)の弊害で、コモンネームがwww.monmon.jpになってるんじゃ……と思い、SMTPサーバをwww.monmon.jpに変更したところ解消しました。
次にやってみたこと……
ここでやめておけばよかったものの……
じゃ、www.monmon.jpは使ってないので、この機会に証明書を取り直しておこう、と monmon.jp だけで証明書を取得しなおしたのです。
すると再び、TLS Negotiation failed が発生。。
openssl s_client -connect monmon.jp:587 -starttls smtp
で、587ポートに利用されている証明書を確認するも、
CN = monmon.jp
と、問題なさそう。
証明書ファイルも
openssl x509 -in /etc/letsencrypt/live/monmon.jp/cert.pem -text
確認してみたところ、
CN = monmon.jp
と、意図したものになってる。
が、エラーは解消されず。
465番ポートでTLSを使わずにSSLで送ると解消されるケースも。とあったので試してみたのですが撃沈。
しかたがないので……暫定対応
にっちもさっちもいかないので、ひとまず25番ポートにて送信を。。。非セキュア通信なのでキモチワルイのですが、暫定的に。
ド趣味の検証サーバなので大事には至らないのですが、もし仕事としての案件の場合は対策考えないとなぁ。
こちら側でログが見えないのが、マヂ辛い。。
改めてポートを確認したところ……
openssl s_client -connect monmon.jp:587 -starttls smtp
あれ?
00d0 - 19 4f 60 51 88 a3 47 a3-9d 9a 44 1b b3 5c 2e 7b .O`Q..G...D..\.{
Start Time: 1644230895
Timeout : 7200 (sec)
Verify return code: 10 (certificate has expired)
Extended master secret: no
Max Early Data: 0
なぜか期限切れエラーが出てる。
うーん、証明書のパスなんかを一通り調査するもなんら問題無し。
ハマること数時間……不思議なファイルを見つけました。
以下で作った、SNI運用証明書のマップファイル tls_server_sni_maps.db これのサイズが妙にデカイ。
もしかして、マッピングをベースに証明書をアーカイブしているんじゃ……
試しに、再構築してみました。
sudo postmap -F /etc/postfix/tls_server_sni_maps
すると。
openssl s_client -connect monmon.jp:587 -starttls smtp
.....
00d0 - 19 fd 19 1e d8 ba d1 7a-b3 5e f0 b8 19 75 4b be .......z.^...uK.
Start Time: 1644231440
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
Max Early Data: 0
エラーが消えた。
まさか……
Gmailのアカウント設定を行ってみたら、TLS Negotiation failed, the certificate doesn’t match the host., code: 0 エラーが解消されて通常稼働しました(涙
原因は
・証明書のコモンネームを明確にしSMTPサーバと一致させる事
・あとは、証明書の更新にあわせてpostfixだけではなく、tls_server_sni_maps.db も再構築する
ことが必要みたいですね。
証明書の更新タイミングでの、tls_server_sni_maps.db の更新についてはこちらにまとめておきます。