« Connection closed before handshake » sur TV Samsung récente (TLS 1.3)

Bonjour Bercolly,

Avec l’aide de Claude

Je pilote une TV Samsung 4K OLED récente (TQ65S90F) avec le plugin TvDomSamsung (version beta, sans démon, modèle Tizen, port 8002 + SSL), sur une box Jeedom Atlas (Debian 11, PHP 7.4.33, OpenSSL 1.1.1w).

Symptômes
Chaque commande échouait avec « Erreur Tv sendKey() [status : 1 reception-Connection closed before handshake] ». La TV affichait à chaque fois la demande d’autorisation, sans que le plugin la prenne en compte : le token n’était jamais mis à jour. C’est exactement le symptôme de ces deux fils restés sans réponse :

Diagnostic

  • La TV répond correctement : avec curl, puis avec un script PHP brut (TLS par défaut), la TV renvoie « 101 Switching Protocols » puis l’événement ms.channel.connect (avec un nouveau token une fois le popup validé). Curl négocie du TLS 1.3 (TLS_AES_256_GCM_SHA384).
  • Avec les bibliothèques embarquées dans le plugin (ratchet/pawl v0.3.1, react/socket v0.8.10, react/event-loop v0.5.1, ratchet/rfc6455 v0.2.3), les options par défaut donnent « Connection closed before handshake » dès la première seconde.
  • En forçant TLS 1.2, le handshake réussit immédiatement et la TV envoie ms.channel.connect. Je n’ai pas cherché la cause exacte côté react/socket ; l’hypothèse est que la pile React 0.8.x en mode non bloquant gère mal le TLS 1.3 de ces TV récentes. Le tableau de compatibilité de la documentation s’arrête à la série R (2019).

Correctif testé
Dans ConnectorImpl_Tizen_Modeles_K.php, ajouter la méthode de chiffrement dans les options TLS :

'tls' => [ 'verify_peer' => false, 'verify_peer_name' => false, 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT ]

Résultat : 15 commandes envoyées à la suite sans erreur. Au premier appel, le plugin reçoit le nouveau token, l’enregistre dans tokenAuth, puis la TV ne redemande plus d’autorisation.

Remarque annexe
Dans sendKey, quand la TV répond un événement autre que ms.channel.connect (par exemple ms.channel.unauthorized ou ms.channel.timeOut), la branche « unknown event » ferme la connexion sans passer le statut en erreur : Jeedom affiche alors un succès alors que la touche n’a pas été envoyée. Mettre $_status->status = 1 dans cette branche rendrait l’échec visible.

Serait-il possible d’intégrer ce correctif (éventuellement avec un essai en TLS par défaut puis un repli en TLS 1.2) et de mettre à jour la liste des modèles compatibles ? Je peux fournir les logs complets si cela peut aider.

Merci pour ce plugin et pour votre travail.

1 « J'aime »

Pour ceux qui veulent bien modifier leur plugin TvDomSamsung en local
Lancer ces lignes en SSH (PuTTY)

cd /var/www/html/plugins/TvDomSamsung/core/class/Telecommande/Connectors/
sudo cp ConnectorImpl_Tizen_Modeles_K.php ConnectorImpl_Tizen_Modeles_K.php.bak
sudo sed -i « s/‹ verify_peer_name › => false]/‹ verify_peer_name › => false, ‹ crypto_method › => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT]/ » ConnectorImpl_Tizen_Modeles_K.php
sudo chown www-data:www-data ConnectorImpl_Tizen_Modeles_K.php
grep -n crypto_method ConnectorImpl_Tizen_Modeles_K.php

1 « J'aime »