アップグレード後、メール送信が機能しない

数日前、Discourse を、正確なバージョンは覚えていませんが、おそらく 2.4 ベータ版だったと強く信じています(ただし断言はできません)が、現在の 2.4.0.beta4 にアップグレードしました。

最近、メール送信が機能しなくなったことに気づきました。Sidekiq に多くの失敗したジョブが存在しています。それらのジョブすべてで発生しているエラーは以下の通りです:“Jobs::HandledExceptionWrapper: Wrapped OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: unsupported protocol”。

私のメール設定は、他のあらゆる種類のクライアントでも問題なく動作している古いメールサーバーを指しています。ポート 587、平文認証、そして enable_starttls_auto を true に設定しています。これは今年初めに Discourse をセットアップして以来正常に動作していましたが、最新のアップグレード以降に動作しなくなったことは間違いありません。この間、オペレーティングシステムもメールサーバーも変更やアップグレードは行われていません。

Discourse Version 2.4 を読みましたが、メールや OpenSSL に関する記述は見当たりませんでした。

Q1: 最後のアップグレードとそれ以前のアップグレードがどのバージョンから行われたかを確認できる場所はどこですか?それにより、使用していたバージョンを追跡できます。

Q2: メールジョブの失敗がいつ始まったのか、より具体的なタイムスタンプはどこで確認できますか?Sidekiq でジョブをクリックすると、2 日前に作成されたと表示されます。これは私がアップグレードを行った時期と一致していると思われますが、それ以前にメールジョブが失敗していなかったことを確認したいのです。

Q3: 推測するに、私が現在実行しているバージョン(以前実行していたバージョンと比較して)で OpenSSL に関連する何らかの変更があったのでしょう。これは何だった可能性があり、調整できる設定はありますか?それともダウングレードを試みるべきでしょうか?あるいは、ジョブ処理から追加の情報を得て、どのプロトコルについて問題が報告されているかを確認する方法はありますか?

あなた用ですよ @gerhard :wink:

Docker コンテナ内から SMTP サーバーへの接続を試してみてください。

openssl s_client -connect <hostname>:<port> -starttls smtp

動作しますか?どのプロトコルが選択されましたか?出力の末尾には、以下のような表示が現れるはずです。

SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256

または TLS 1.3 を使用している場合

New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384

Docker 内での 4 回の実行結果は以下の通りです:

root@foo-app:/# openssl s_client -connect mail.foo.com:587 -starttls smtp
CONNECTED(00000003)
139861698753664:error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol:../ssl/statem/statem_lib.c:1922:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 320 bytes and written 353 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
root@foo-app:/#
root@foo-app:/#
root@foo-app:/# openssl s_client -connect mail.foo.com:587 -starttls smtp -tls1_1
CONNECTED(00000003)
140427988595840:error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol:../ssl/statem/statem_lib.c:1922:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 320 bytes and written 174 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.1
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1568985038
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
---
root@foo-app:/#
root@foo-app:/#
root@foo-app:/# openssl s_client -connect mail.foo.com:587 -starttls smtp -tls1_2
CONNECTED(00000003)
140184139936896:error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol:../ssl/statem/statem_lib.c:1922:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 320 bytes and written 258 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1568985044
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
---
root@foo-app:/#
root@foo-app:/#
root@foo-app:/# openssl s_client -connect mail.foo.com:587 -starttls smtp -tls1_3
CONNECTED(00000003)
write:errno=0
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 262 bytes and written 278 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
root@foo-app:/#

TLS 1.3 以外を強制した場合(openssl コマンドに追加引数を指定、詳細は下記参照)に「protocol unsupported」というエラーメッセージが表示され、TLS 1.3 のみを強制した場合にのみ「write:errno=0」が表示されます。ご提示いただいたコマンド(TLS の強制を行わない場合)では、特定のバージョンが使用/試行されている様子は確認できませんでした。

もし質問1と2にお答えいただければ幸いです。できるだけ早くこのバージョンをダウングレードできるか検討する必要があり、そのためには最後に正常に動作していたバージョンを知る必要があります。

現在、キューに3682件の失敗したメールジョブがあります。アカウント作成の検証メールも、その他のメールも送信されていません。

/var/discourse/launcher を編集し、91 行目のベースイメージバージョン(image="discourse/base:2.0.20190906-0522")を image="discourse/base:2.0.20190625-0946" に置き換えてください。

その後、コンテナを再構築し、E-mail sending not working after upgrade - #4 by rawtaz で実行したコマンドを実行してください。TLS 1.3 は機能しませんが、他のコマンドの出力は似ていますか?似ていない場合、何が異なりますか?

SMTP のホスト名が公開されている場合は、PM で教えてください。

@gerhard さん、ありがとうございます!あなたの提案で問題が解決しました。ベースイメージのバージョンを変更して再ビルドしたところ、すぐにフォーラムから待機中のメール(約 1 万件 :D)が送信され始めました。

コンテナ内で再度コマンドを実行したところ、他の(成功した)出力が表示されました。この出力には証明書やその他の情報が含まれているため、特に必要でなければここに貼り付けない方が良いかと思います。もしこれが問題で、どうしても必要であればお知らせください。

メールサーバーのホスト名を PM で送りますので、より詳細にこの問題をデバッグしてください。ただし、この情報は秘密にしてください :slight_smile: ありがとうございます!

編集:問題が解決したため、あなたの最後の投稿を「解決策」としてマークします。ただし、明らかに新しいベースイメージで何が原因なのかを特定する必要があります。そうすれば、将来アップデートできるようになります。

はい、古いイメージを使い続けることは長期的な解決策ではありません。そのイメージは実質的にサポートが終了しており、何かが機能し始める可能性があります…

この問題は、Email SSL Errors after Update to 2.4.0.beta4 と類似しています。SMTP を TLSv1.2 に更新し、DH キーサイズを少なくとも 2048 ビットにすることを推奨します。

回避策として、app.yml の末尾にある run セクションに sed コマンドを追加し、/etc/ssl/openssl.cnf ファイルから以下の 2 つの設定を削除できます。

MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=2