L'envoi d'e-mails ne fonctionne plus après la mise à niveau

Il y a quelques jours, j’ai mis à jour mon instance Discourse depuis une version dont je ne me souviens plus exactement, mais je suis convaincu (sans pouvoir l’affirmer catégoriquement) qu’il s’agissait d’une version bêta 2.4, vers la version actuelle 2.4.0.beta4.

Récemment, j’ai constaté que l’envoi d’e-mails ne fonctionne plus : j’ai de nombreuses tâches échouées dans Sidekiq. L’erreur pour toutes ces tâches est la suivante : « Jobs::HandledExceptionWrapper: Wrapped OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: unsupported protocol ».

Mes paramètres d’e-mail pointent vers un ancien serveur de messagerie qui fonctionne par ailleurs parfaitement pour tous les clients, quels que soient leur type. La configuration utilise le port 587 avec une authentification simple et l’option enable_starttls_auto définie à true. Cela a fonctionné sans problème depuis que j’ai installé Discourse plus tôt cette année, donc je suis presque certain que le dysfonctionnement est apparu après les dernières mises à jour. Le système d’exploitation n’a pas été modifié ni mis à jour durant cette période, et le serveur de messagerie non plus.

J’ai lu Discourse Version 2.4, mais je n’y trouve rien concernant les e-mails ou OpenSSL.

Q1 : Où puis-je vérifier à partir de quelle version la dernière mise à jour a été effectuée, ainsi que la version précédente, afin de retracer l’historique des versions que j’ai utilisées ?

Q2 : Où puis-je trouver des horodatages plus précis indiquant quand les tâches d’envoi d’e-mails ont commencé à échouer ? J’ai cliqué sur une tâche dans Sidekiq et il est indiqué qu’elle a été créée il y a deux jours, ce qui semble correspondre au moment où j’ai effectué la mise à jour. Cependant, je voudrais vérifier que les tâches d’e-mail n’ont pas échoué avant cela.

Q3 : On peut supposer que quelque chose lié à OpenSSL a changé dans la version que j’exécute actuellement par rapport à celle que j’utilisais auparavant. Qu’aurait-ce pu être, et existe-t-il un paramètre que je pourrais ajuster ? Ou devrais-je essayer de revenir à une version antérieure ? Existe-t-il un moyen d’obtenir plus d’informations sur le traitement des tâches afin de voir quel protocole est en cause ?

Un pour toi @gerhard :wink:

Pouvez-vous essayer de vous connecter au serveur SMTP depuis l’intérieur du conteneur Docker ?

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

Cela fonctionne-t-il ? Quel protocole est sélectionné ? Vous devriez voir quelque chose comme ceci vers la fin de la sortie :

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

ou, s’il utilise TLS 1.3 :

New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384

Voici quatre exécutions dans 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:/#

Je vois un message d’erreur « protocole non pris en charge » lorsque je force TLS autre que 1.3 (en utilisant des arguments supplémentaires à la commande openssl, voir ci-dessous), et « write:errno=0 » uniquement lorsque je force TLS 1.3. Avec votre commande (sans forcer TLS), je ne vois aucune version spécifique utilisée ou tentée.

Si quelqu’un pouvait répondre aux questions n°1 et n°2, ce serait très utile. Je dois déterminer s’il existe un moyen de revenir à une version antérieure dès que possible, et pour cela, j’ai besoin de savoir quelle était la dernière version fonctionnelle.

J’ai maintenant 3682 tâches d’e-mail échouées dans ma file d’attente. Les e-mails de vérification de création de compte ne sont pas envoyés, ni aucun autre.

Veuillez éditer /var/discourse/launcher et remplacer la version de l’image de base (image="discourse/base:2.0.20190906-0522") à la ligne 91 par image="discourse/base:2.0.20190625-0946"

Reconstruisez ensuite le conteneur et exécutez les commandes que vous avez lancées sur E-mail sending not working after upgrade - #4 by rawtaz. TLS 1.3 ne fonctionnera pas, mais la sortie des autres commandes est-elle similaire ? Si non, quelles sont les différences ?

Pourriez-vous m’envoyer en MP le nom d’hôte du serveur SMTP au cas où il serait accessible publiquement ?

Merci @gerhard ! Ta suggestion a résolu le problème. J’ai changé la version de l’image de base, reconstruit, et immédiatement le forum a commencé à envoyer les e-mails en file d’attente (environ 10 000 :D).

J’ai de nouveau exécuté les commandes dans le conteneur et j’obtiens d’autres résultats (avec succès). Cette sortie contient des certificats et beaucoup d’autres éléments, donc sauf si tu en as vraiment besoin, je préfère ne pas la coller ici. Fais-moi savoir si c’est un problème et si tu en as vraiment besoin.

Je t’enverrai en MP le nom d’hôte du serveur de messagerie afin que tu puisses déboguer ce problème plus en détail – s’il te plaît, garde-le pour toi :slight_smile: Merci !

Edit : Je marque ton dernier message comme solution car il a résolu le problème. Cependant, il est évident que nous devons identifier ce qui cause cela dans la nouvelle image de base, afin de pouvoir mettre à jour à l’avenir.

Oui, rester sur l’ancienne image n’est pas une solution à long terme. Cette image n’est essentiellement plus prise en charge et des problèmes pourraient commencer à survenir…

Ce problème est similaire à Email SSL Errors after Update to 2.4.0.beta4. Je vous suggère de mettre à jour votre SMTP pour utiliser TLSv1.2 et une taille de clé DH d’au moins 2048 bits.

En tant que solution de contournement, vous devriez pouvoir ajouter des commandes sed dans la section run à la fin de app.yml pour supprimer les deux paramètres suivants du fichier /etc/ssl/openssl.cnf.

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