Отправка электронной почты не работает после обновления

Несколько дней назад я обновил свой 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.

Вопрос 1: Где можно узнать, с какой версии было выполнено последнее обновление и какая версия была перед этим, чтобы я мог отследить используемые мной версии?

Вопрос 2: Где можно найти более точные временные метки начала сбоев почтовых заданий? Я кликнул на задание в Sidekiq, и оно показало, что было создано два дня назад, что, по-моему, совпадает со временем моего обновления. Но я хотел бы убедиться, что почтовые задания не срывались до этого.

Вопрос 3: Предположительно, в версии, которую я сейчас использую (по сравнению с предыдущей), что-то изменилось, связанное с OpenSSL. Что именно это могло быть, и есть ли где-то настройка, которую можно подправить? Или мне стоит попробовать откатиться на предыдущую версию? Или есть ли способ получить дополнительную информацию от обработки заданий, чтобы понять, какой именно протокол вызывает ошибку?

Один для тебя, @gerhard :wink:

Попробуйте подключиться к SMTP-серверу изнутри контейнера Docker:

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:

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, см. ниже), я вижу сообщение об ошибке «unsupported protocol» (протокол не поддерживается), а при принудительном использовании TLS 1.3 — только «write:errno=0». С вашей командой (без принудительного указания версии TLS) я не вижу, какая именно версия используется или предпринимается попытка её использования.

Будет очень полезно, если кто-то сможет ответить на вопросы №1 и №2. Мне нужно понять, есть ли способ откатить это как можно скорее, и для этого мне нужно знать, какая была последняя рабочая версия.

У меня сейчас в очереди 3682 неудачных задания по отправке электронной почты. Письма с подтверждением регистрации аккаунта, а также любые другие письма не отправляются.

Пожалуйста, отредактируйте файл /var/discourse/launcher и замените версию базового образа (image="discourse/base:2.0.20190906-0522") на строке 91 на image="discourse/base:2.0.20190625-0946".

После этого пересоберите контейнер и выполните команды, которые вы запускали по адресу E-mail sending not working after upgrade - #4 by rawtaz. TLS 1.3 работать не будет, но похож ли вывод других команд? Если нет, чем они отличаются?

Могли бы вы отправить мне в личное сообщение (PM) имя хоста SMTP, если оно общедоступно?

Спасибо, @gerhard! Твое предложение решило проблему. Я изменил версию базового образа, пересобрал контейнер, и форум сразу же начал отправлять очередь писем (около 10 тысяч :D).

Я снова выполнил команды внутри контейнера и получил другой (успешный) вывод. Этот вывод содержит сертификаты и множество других данных, поэтому, если это тебе действительно не нужно, я бы предпочел не вставлять его сюда. Дай знать, если это проблема и тебе действительно это требуется.

Я отправлю тебе в личное сообщение имя хоста почтового сервера, чтобы ты мог более детально отладить эту проблему — пожалуйста, держи это в секрете :slight_smile: Спасибо!

Редактирование: Я отмечаю твой последний пост как решение, так как он решил проблему. Однако, очевидно, нам нужно выяснить, что вызывает это в более новой версии базового образа, чтобы можно было обновляться в будущем.

Да, оставаться на старом образе — это не долгосрочное решение. Этот образ фактически не поддерживается, и со временем могут начаться сбои…

Эта проблема похожа на Email SSL Errors after Update to 2.4.0.beta4. Рекомендую обновить ваш SMTP для использования TLSv1.2 и размера ключа DH не менее 2048 бит.

В качестве временного решения вы можете добавить команды sed в секцию run в конце файла app.yml, чтобы удалить следующие два параметра из файла /etc/ssl/openssl.cnf.

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