Gmailから外部アカウントのメールを送信しようとすると TLS Negotiation failed で送信エラーとなる現象が数日前から発生していたのですが、
4月に行われたGoogleのアップデートによる影響で、SMTPサーバのホスト名と証明書のホスト名が異なるとエラーになることが原因の様です。
GmailのSMTPサーバ名を初期ドメインへ設定を変更すると解決しましたのでメモしておきます。
Gmailから外部アカウントのメールを送信しようとすると TLS Negotiation failed エラーが出るのはGmailのセキュリティ強化の影響らしい。
SMTPサーバのホスト名と証明書のホスト名が異なるから。
SMTPサーバに独自ドメインを設定している場合、初期ドメインへ設定を変更すると解決した。— 山添 知久(zoe)/IoT (@zoe6120) April 18, 2020
現象
Gmailで送信するとMailar Daemonからエラーが返ってきました。時々発生するのと、Gmailで管理している複数アカウントの一部で発生していたところから送信先の要因かと思いました。
TLS Negotiation failed, the certificate doesn’t match the host
「TLS Negotiation failed, gmail」などで検索するとヒットします。
グローバルで発生している模様で、すでに先人がWebで発信されており大変助かりました。
[Qiita] Gmailで他のSMTPサーバー経由でメールの配信エラーになる問題
さくらインターネットのお知らせ: Gmailに設定している、弊社メールアドレスからメール送信できなくなったお客様へ
要因
Gmailで外部のメールアドレスを登録している場合、SMTPサーバのホスト名と証明書のホスト名が異なると上記のTLS Negotiation failed が発生して接続できないことが原因でした。
Gmailの設定でも「変更を保存」ボタンをクリックすると接続を試みてエラーが表示されます。
opensslコマンドで証明書ドメインを確認する
前述のQiitaに、openssl コマンドでSMTPサーバへの証明書ドメイン名を確認する方法がありましたので試してみました。
openssl s_client -connect <smtpサーバ名>:<ポート> -starttls smtp
確かに、xxxxで入力したSMTPサーバに対して、Certificate chain で返ってきた証明書のドメインは yyyy で異なっていました。
応答が返ってきた後は quit コマンドで終了します。
$ openssl s_client -connect xxxx.xxxxx.xx:587 -starttls smtp
CONNECTED(00000003)
...
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
0 s:/CN=*.yyyy.yyyyy.yy
...
---
Server certificate
-----BEGIN CERTIFICATE-----
... 省略
-----END CERTIFICATE-----
subject=/CN=*.yyyy.yyyyy.yy
issuer=/C=JP/O=Japan Registry Services Co., Ltd./CN=JPRS Domain Validation Authority - G2
---
No client certificate CA names sent
---
SSL handshake has read 3776 bytes and written 528 bytes
---
... 省略
---
250 DSN
quit
221 2.0.0 Bye
closed
解決策
SMTPサーバ名を独自ドメインではなくて、初期ドメイン、オリジナルのドメインに変更することで解決しました。やれやれ。
まとめ
Gmailで外部メールアカウントを使用しているユーザは多いと思うので、この影響は結構大きいのではないかと思います。
メールアカウントは最初1回設定したら忘れてしまうので、さて初期ドメインは何だったけと調べるのがちょっと手間でした。
もう少し大々的にセキュリティアップデートのアナウンスがあっても良かったと思いますね。
解決方法教えていただきありがとうございました。
おかげで自力で直すことができました。
コメントありがとうございます。
色々な方の発信で既出の内容ですが少しでもお役に立てれば嬉しいです。
初心者で大変申し訳ありません。
コマンドプロントを開くまではできたのですが、「openssl s_client -connect xxxx.xxxxx.xx:587 -starttls smtp」を入力したらいいのでしょうか???
xxxx.xxxxx.xx部分にポート番号?を入力するのでしょうか。。。
しばまりさん、コメントありがとうございます。
xxxx.xxxx.xx 部分にSMTPサーバ名を入力します。587がポート番号です。
例えばSMTPサーバが「mail.zoe6120.ne.jp」であれば次の通りです。(このサーバは実在しないのでエラーになります)
記事の説明の部分に <サーバ名>:<ポート> のサーバ名が抜けていましたので修正しました。申し訳ありません。
それから openssl コマンドはLinuxあるいはWindowsのWSLで実行します。Windowsのコマンドプロンプトでは実行できません。