TLS-Unterstuetzung fuer MQTT
MqttBridge(ssl=True) / mqtt_config.SSL: umqtt.simple.MQTTClient wird mit
ssl_params={"server_hostname": ..., "cert_reqs": CERT_NONE} aufgebaut --
SNI fuer virtuelle Hosts hinter einem Reverse-Proxy, aber ohne
Zertifikatspruefung (kein CA-Bundle auf dem Geraet). Verschluesselt die
Zugangsdaten auf der Leitung, schuetzt aber nicht vor einem aktiven
Man-in-the-Middle.
Anlass: Der Broker wechselte auf einen Host, der nur noch TLS anbot --
Klartext gegen den TLS-Port endete in ECONNRESET.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017zTSXLK4w32PoCmFgSzp68
This commit is contained in:
@@ -132,6 +132,46 @@ class TestVerbinden(MqttTest):
|
||||
self.assertFalse(self.bridge.connected)
|
||||
|
||||
|
||||
class FakeMQTTClient:
|
||||
"""Ersatz fuer umqtt.simple.MQTTClient selbst (nicht fuer eine Instanz) --
|
||||
zeichnet nur auf, mit welchen Argumenten mqtt._neuer_client() ihn baut."""
|
||||
|
||||
aufrufe = []
|
||||
|
||||
def __init__(self, client_id, server, **kwargs):
|
||||
FakeMQTTClient.aufrufe.append((client_id, server, kwargs))
|
||||
|
||||
|
||||
class TestNeuerClient(unittest.TestCase):
|
||||
"""mqtt.MqttBridge._neuer_client(): baut den echten MQTTClient auf (kein
|
||||
FakeClient injiziert). Schwerpunkt TLS -- siehe mqtt_config_example.py."""
|
||||
|
||||
def setUp(self):
|
||||
FakeMQTTClient.aufrufe = []
|
||||
self._alt = mqtt.MQTTClient
|
||||
mqtt.MQTTClient = FakeMQTTClient
|
||||
self.addCleanup(lambda: setattr(mqtt, "MQTTClient", self._alt))
|
||||
|
||||
def test_ohne_ssl_werden_keine_ssl_argumente_gesetzt(self):
|
||||
bridge = mqtt.MqttBridge(broker="b", port=1883)
|
||||
bridge._neuer_client()
|
||||
_, _, kwargs = FakeMQTTClient.aufrufe[0]
|
||||
self.assertNotIn("ssl", kwargs)
|
||||
self.assertNotIn("ssl_params", kwargs)
|
||||
|
||||
def test_ssl_setzt_server_hostname_und_cert_none(self):
|
||||
import ssl as echtes_ssl
|
||||
bridge = mqtt.MqttBridge(broker="mqtt.example.org", port=8883, ssl=True)
|
||||
bridge._neuer_client()
|
||||
client_id, server, kwargs = FakeMQTTClient.aufrufe[0]
|
||||
self.assertEqual(server, "mqtt.example.org")
|
||||
self.assertTrue(kwargs["ssl"])
|
||||
self.assertEqual(kwargs["ssl_params"]["server_hostname"],
|
||||
"mqtt.example.org")
|
||||
self.assertEqual(kwargs["ssl_params"]["cert_reqs"],
|
||||
echtes_ssl.CERT_NONE)
|
||||
|
||||
|
||||
class TestEmpfang(MqttTest):
|
||||
|
||||
def setUp(self):
|
||||
|
||||
Reference in New Issue
Block a user