Envio de e-mail não funciona após atualização

Há alguns dias, atualizei meu Discourse de uma versão que não sei exatamente qual era, embora eu acredite firmemente (mas não posso afirmar com certeza) que era uma beta 2.4, para a atual 2.4.0.beta4.

Recentemente, notei que o envio de e-mails parou de funcionar; tenho muitos jobs falhos no Sidekiq. O erro em todos esses jobs é: “Jobs::HandledExceptionWrapper: Wrapped OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: unsupported protocol”.

Minhas configurações de e-mail apontam para um servidor de e-mail antigo meu (que, de resto, funciona bem para todos os clientes, de diversos tipos), na porta 587, com autenticação simples e enable_starttls_auto definido como true. Tudo funcionou perfeitamente desde que configurei o Discourse no início deste ano, então tenho quase certeza de que o problema começou após as últimas atualizações. O sistema operacional não foi alterado/atualizado durante esse período, nem o servidor de e-mail.

Li Discourse Version 2.4 e não encontrei nada relacionado a e-mail ou OpenSSL lá.

P1: Onde posso verificar a partir de qual versão a última atualização e a anterior foram feitas, para que eu possa rastrear as versões que utilizei?

P2: Onde posso encontrar carimbos de data/hora mais específicos para quando os jobs de e-mail começaram a falhar? Cliquei em um job no Sidekiq e ele informa que foi criado há dois dias, o que acredito estar alinhado com o momento em que fiz a atualização. Mas gostaria de verificar se os jobs de e-mail não falharam antes disso.

P3: Provavelmente algo relacionado ao OpenSSL mudou na versão que comecei a executar (em relação à versão anterior). O que poderia ter sido isso, e existe alguma configuração que eu possa ajustar? Ou devo tentar fazer o downgrade? Ou há alguma maneira de obter mais informações sobre o processamento do job para ver qual protocolo está causando o problema?

Uma para você, @gerhard :wink:

Você pode tentar conectar ao servidor SMTP de dentro do contêiner Docker?

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

Funciona? Qual protocolo ele seleciona? Você deve ver algo assim perto do final da saída:

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

ou, quando estiver usando TLS 1.3:

New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384

Aqui estão quatro execuções dentro do 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:/#

Estou recebendo uma mensagem de erro “protocolo não suportado” ao forçar TLS diferente da versão 1.3 (usando argumentos adicionais no comando openssl, veja abaixo), e “write:errno=0” apenas ao forçar TLS 1.3. Com o seu comando (sem forçar TLS), não estou vendo nenhuma versão específica sendo usada ou tentada.

Se alguém puder responder às perguntas #1 e #2, seria muito útil. Preciso avaliar se há uma maneira de reverter para uma versão anterior o mais rápido possível e, para isso, preciso saber qual foi a última versão que funcionava corretamente.

Agora tenho 3.682 tarefas de e-mail com falha na minha fila. Os e-mails de verificação de criação de conta não estão sendo enviados, nem nada mais.

Edite /var/discourse/launcher e substitua a versão da imagem base (image="discourse/base:2.0.20190906-0522") na linha 91 por image="discourse/base:2.0.20190625-0946"

Reconstrua o container em seguida e execute os comandos que você rodou em E-mail sending not working after upgrade - #4 by rawtaz. O TLS 1.3 não funcionará, mas a saída dos outros comandos é semelhante? Se não, o que é diferente?

Você poderia me enviar por mensagem privada o hostname do SMTP, caso esteja publicamente disponível?

Obrigado @gerhard! Sua sugestão resolveu o problema. Alterei a versão da imagem base, reconstruí e, imediatamente, o fórum começou a enviar os e-mails em fila (cerca de 10 mil :D).

Executei os comandos novamente no contêiner e obtive outras saídas (bem-sucedidas). Essa saída contém certificados e um monte de outras coisas, então, a menos que você realmente precise, prefiro não colá-la aqui. Me avise se isso for um problema e se você realmente precisar dela.

Vou te enviar por mensagem privada o nome do servidor de e-mail para que você possa depurar esse problema com mais detalhes — por favor, mantenha isso em segredo :slight_smile: Obrigado!

Edição: Estou marcando sua última resposta como solução porque ela resolveu o problema. No entanto, obviamente precisamos identificar o que está causando isso na imagem base mais recente, para que seja possível atualizar no futuro.

Sim, permanecer na imagem antiga não é uma solução de longo prazo. Essa imagem, essencialmente, não tem mais suporte e as coisas podem começar a falhar…

Este problema é semelhante ao Email SSL Errors after Update to 2.4.0.beta4. Sugiro que você atualize seu SMTP para usar TLSv1.2 e um tamanho de chave DH de pelo menos 2048 bits.

Como solução alternativa, você deve poder adicionar comandos sed à seção run no final do app.yml para remover as seguintes duas configurações do arquivo /etc/ssl/openssl.cnf.

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