Ошибки SSL в почте после обновления до 2.4.0.beta4

После обновления до версии 2.4.0.beta4 ни одна из моих установок, использующих Rackspace для исходящей почты, не может отправлять исходящие письма. Учитывая, что сервер исходящей почты — снова Rackspace, я предполагаю, что их настройки SSL/TLS корректны (к тому же они, судя по всему, работают во всех основных почтовых клиентах). Возможно, это связано с этой темой.

Однако после применения последних обновлений (я точно не знаю, какое именно изменение стало причиной) ошибка больше не совпадает с той, что упоминается в указанной теме, а теперь выглядит так:

Jobs::HandledExceptionWrapper: Wrapped Net::ReadTimeout: Net::ReadTimeout with #<TCPSocket:(closed)>

Я полагаю, что это баг.

Редакция: Ещё одна связанная тема

@Gerhard

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

SMTP с StartTLS (по умолчанию, если вы не изменили DISCOURSE_SMTP_ENABLE_START_TLS в app.yml):

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

SMTP

openssl s_client -connect <hostname>:<port>

С флагом -starttls он просто возвращает “CONNECTED”. Без -starttls:

root@omnifora-com-app:/var/www/discourse# openssl s_client -connect secure.emailsrvr.com:465
CONNECTED(00000003)
depth=2 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Certification Authority
verify return:1
depth=1 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Domain Validation Secure Server CA
verify return:1
depth=0 OU = Domain Control Validated, OU = EssentialSSL, CN = secure.emailsrvr.com
verify return:1
139636332590208:error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small:../ssl/statem/statem_clnt.c:2156:
---
Цепочка сертификатов
 0 s:OU = Domain Control Validated, OU = EssentialSSL, CN = secure.emailsrvr.com
   i:C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Domain Validation Secure Server CA
 1 s:C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Domain Validation Secure Server CA
   i:C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Certification Authority
 2 s:C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Certification Authority
   i:C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root
 3 s:C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root
   i:C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root
---
Сертификат сервера
-----BEGIN CERTIFICATE-----
MIIG5jCCBc6gAwIBAgIRAMWoQ0lmf1VC8Ch8zZZTHm0wDQYJKoZIhvcNAQELBQAw
gZAxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMTYwNAYD
VQQDEy1DT01PRE8gUlNBIERvbWFpbiBWYWxpZGF0aW9uIFNlY3VyZSBTZXJ2ZXIg
Q0EwHhcNMTkwMTEwMDAwMDAwWhcNMjAwMzEwMjM1OTU5WjBZMSEwHwYDVQQLExhE
b21haW4gQ29udHJvbCBWYWxpZGF0ZWQxFTATBgNVBAsTDEVzc2VudGlhbFNTTDEd
MBsGA1UEAxMUc2VjdXJlLmVtYWlsc3J2ci5jb20wggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQDZzFpkI/ujPCuNZpHLueu+/iqUsc5U7+yYa9d6xIbkh2BN
u+OpBNCTn4ACa0a3EaqRVyceUUh8TodUPtkZYLZO6iqwl2eOd8h3NXxtRlyaj0Hz
uSOlRbA5CiVZ4H1Ia8k/DVh+r1Rk6Da/f52wBJE8ICFgm7Uyrjtfcc90gBk+7i4I
y1aNwKW/nqmqQBEiTeyUF2kJiTovtorQo7zaedPefm2VUoKyxe/8jl7qA7F9+1p0
XvvWrc3/vqEEZR6tmcAF8tmp0MSkMnt3klwg/xopVn5nPq52t6fLRXA0aLFBUHzT
U82Iw1Weg+gUVi77ONDIabfYuCqqEgpnAyeUhh8hAgMBAAGjggNvMIIDazAfBgNV
HSMEGDAWgBSQr2o6lFoL2JDqElZz30O0Oija5zAdBgNVHQ4EFgQUFJzBKVTbToPC
UoxWxXfRAJGz+YswDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAwHQYDVR0l
BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCME8GA1UdIARIMEYwOgYLKwYBBAGyMQEC
AgcwKzApBggrBgEFBQcCARYdaHR0cHM6Ly9zZWN1cmUuY29tb2RvLmNvbS9DUFMw
CAYGZ4EMAQIBMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly9jcmwuY29tb2RvY2Eu
Y29tL0NPTU9ET1JTQURvbWFpblZhbGlkYXRpb25TZWN1cmVTZXJ2ZXJDQS5jcmww
gYUGCCsGAQUFBwEBBHkwdzBPBggrBgEFBQcwAoZDaHR0cDovL2NydC5jb21vZG9j
YS5jb20vQ09NT0RPUlNBRG9tYWluVmFsaWRhdGlvblNlY3VyZVNlcnZlckNBLmNy
dDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMDkGA1UdEQQy
MDCCFHNlY3VyZS5lbWFpbHNydnIuY29tghh3d3cuc2VjdXJlLmVtYWlsc3J2ci5j
b20wggGABgorBgEEAdZ5AgQCBIIBcASCAWwBagB3ALvZ37wfinG1k5Qjl6qSe0c4
V5UKq1LoGpCWZDaOHtGFAAABaDf6Nt0AAAQDAEgwRgIhAJDqOzt2LWqviVrjKGFL
UCPuu/HWeuILG/7VuDwJWWYYAiEAvCaXH3lSCRWOgGquaz9lW3uITCuKQP0TOOMv
JPbcN/IAdwBep3P531bA57U2SH3QSeAyepGaDIShEhKEGHWWgXFFWAAAAWg3+jcn
AAAEAwBIMEYCIQCxU8IX94IoSwsrpo6zJoUMO4uNGuTkpLSY0h/KWbspqQIhAIy4
XfY5RtTTLpB3EFLXMyQSL9/gyNpfJ1OtbYtOkL0pAHYA8JWkWfIA0YJAEC0vk4iO
rUv+HUfjmeHQNKawqKqOsnMAAAFoN/o5AAAABAMARzBFAiAePxbn6JuVUkYjBVnF
MPHeqyqAaYpdwyGxaC3Cz4WZhAIhAPFXU3e0+7GkNMjXFPQ6UMd55zeUJcxakFIt
ggm7ioLYMA0GCSqGSIb3DQEBCwUAA4IBAQAkLuNWuHt5GOXkzJlys09mg22+MnhF
4y+abm7F54stsv0A2Gc4my4bEXOZ4ozf0g1Yjb/ZVlSVrNC125CSnXd6bEcesjcn
c3oxO+9dFCQGMH4CZPVSoDKBk41+VP9IcnfibhSzV8wFXQh+Tt1OpRoNgqM888Es
JvYP9B2OgDvQFnDNAcJXM5fgX1CilyXqPtz2QYDNVgN8tuRSRPlaGTkZgGMsCO12
GjxLD5UGsxh5c08KSRgd4Uv6BRH/hE62spqvmDUDzuU+Qx9N4/Tz2ocv8LI8GlqV
RYOe+6lLe8t33yH0dnRWKGrpT8gWkul1qLHI9I7LYZMvMKdcxl8oBBGF
-----END CERTIFICATE-----
subject=OU = Domain Control Validated, OU = EssentialSSL, CN = secure.emailsrvr.com

issuer=C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Domain Validation Secure Server CA

---
Имена CA клиентских сертификатов не отправлены
---
Соединение SSL: прочитано 6414 байт, записано 319 байт
Проверка: OK
---
Новое, (NONE), Шифр: (NONE)
Публичный ключ сервера: 2048 бит
Безопасная пересогласовка: поддерживается
Сжатие: NONE
Расширение: NONE
ALPN не согласован
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: 1569003408
    Timeout   : 7200 (сек)
    Verify return code: 0 (ok)
    Extended master secret: no
---

Кажется, проблема вернулась:

Jobs::HandledExceptionWrapper: Wrapped OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: dh key too small

(По крайней мере, за последние несколько тысяч сбоев.)

Кстати: с днём рождения, @gerhard.

Эта ошибка указывает на то, что SMTP-сервер настроен некорректно и использует ключ DH, который OpenSSL считает слишком коротким.

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

Что ж, ошибка возникает из-за OpenSSL, и, насколько мне известно, мы используем настройки по умолчанию, предоставляемые Debian / Ruby? :man_shrugging:

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

В нашей корпоративной интрасети используется старый центр сертификации Windows, применявший MD5, что полностью нарушило работу HTTPS в моей установке Discourse после обновления. Nginx выдавал ошибку «SSL_CTX_use_certificate: ca md too weak» и отказывался загружать HTTPS-сертификат.

В RHEL и CentOS существует устаревший механизм для их повторного включения, но аналогичного параметра совместимости в Debian/Ubuntu я не нашёл:

Уверен, что с этим столкнутся ещё многие, учитывая количество старых небезопасных сертификатов, циркулирующих в сети, но, вероятно, единственное решение — заменить сертификаты. По поводу проблемы с электронной почтой рекомендую обратиться напрямую в Rackspace.

Это вопрос для @gerhard

Скорее всего, это ошибка. Я попросил техника Rackspace разобраться в ситуации, и он предоставил следующую информацию об их DH-ключе:

Вот общедоступная информация:

CA = Comodo Limited CA
Размер ключа сертификата = 2048 бит
Имя домена = mx1.emailsrvr.com и mx2.emailsrvr.com
Имя хоста почтового сервера = secure.emailsrvr.com
Программное обеспечение почтового хоста (укажите программное обеспечение и версию, работающую на MTA) =
ecelerity 2.2.3.49
Сила шифрования = AES256-SHA

Я считаю, что 2048-битный ключ не следует (корректно) считать «слишком маленьким».

Из U.S. | Let There Be Change | Accenture

В настоящее время рекомендуемый минимальный размер параметров DH составляет 2048 бит. Всё, что равно или меньше 1024 бит, считается небезопасным.

Хорошо, давайте посмотрим на ключ DH, используя более старую версию Debian:

docker run --rm -it debian:stretch
apt update && apt install -y openssl
openssl s_client -connect secure.emailsrvr.com:465 | grep "Server Temp Key"

Да, ключ DH действительно слишком мал:

Server Temp Key: DH, 1024 bits

Я бы сказал, что это проблема, которую должен исправить Rackspace. В качестве временного решения вы можете отредактировать файл /etc/ssl/openssl.cnf и удалить строку CipherString = DEFAULT@SECLEVEL=2 в конце файла. Sidekiq должен подхватить новые настройки OpenSSL после перезапуска контейнера.

openssl s_client -connect secure.emailsrvr.com:465 | grep "Server Temp Key"
depth=3 C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root
verify return:1
depth=2 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Certification Authority
verify return:1
depth=1 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Domain Validation Secure Server CA
verify return:1
depth=0 OU = Domain Control Validated, OU = EssentialSSL, CN = secure.emailsrvr.com
verify return:1
Server Temp Key: DH, 1024 bits

Возвращаемся к общению с Rackspace.

Обновление от Rackspace:

Спасибо за ваше терпение и за то, что обратили наше внимание на эту проблему. Мы подтверждаем, что текущий DH-ключ имеет размер 1024 бита. Наши команды по продукту и разработке признали необходимость увеличения этого параметра и уже разработали план по устранению проблемы.

Точной даты внедрения исправления я пока сообщить не могу, однако наша цель — сделать это в течение текущего месяца. Как только мы увеличим размер DH-ключа, мы обязательно предоставим вам обновление.

Еще раз спасибо, что обратили на это наше внимание! Если у вас возникнут дополнительные вопросы или опасения, пожалуйста, дайте нам знать!

Я обновлю эту тему, как только получу уведомление о том, что ключ DH был обновлен.

С этим патчем мне удалось решить мою проблему, но это не очень обнадеживает :slight_smile:
При следующей пересборке она снова исчезнет, верно? :slight_smile:

Надеемся, что Rackspace исправит проблему до того, как вам потребуется выполнить пересборку. В противном случае вы можете изменить openssl.cnf внутри app.yml, используя команды sed, чтобы внести постоянное изменение.

Обновление от Rackspace:

Благодарим вас за терпение. Размер ключа DH был обновлён и теперь соответствует размеру ключа сертификата. Пожалуйста, протестируйте и сообщите, если у вас возникнут дополнительные вопросы или опасения!

Подтверждено:

openssl s_client -connect secure.emailsrvr.com:465 | grep "Server Temp Key"
depth=3 C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root
verify return:1
depth=2 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Certification Authority
verify return:1
depth=1 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Domain Validation Secure Server CA
verify return:1
depth=0 OU = Domain Control Validated, OU = EssentialSSL, CN = secure.emailsrvr.com
verify return:1
Server Temp Key: DH, 2048 bits

Я также дополнительно проверил, что могу снова отправлять письма из своих установок Discourse. Таким образом, (по крайней мере, для Rackspace) эта проблема решена.