avenga
Goto Top

MQTT Websocket Verbindung über IPv6

Hallo, ich bekomme es nicht hin eine MQTT Websocket Verbindung über IPv6 herzustellen.
Zunächst dachte ich es läge an meinem Mosquitto bzw. an der libwebsockets.
Nun habe ich einen anderen Broker probiert, wo es auch nicht klappt.

Also habe ich es andersrum versucht, mich auf öffentliche Broker zu verbinden, und siehe da es klappt auch nicht.

Server: demo.flashmq.org

wss://[2a01:1b0:7996:418:83:137:146:230]:4443 -> keine Verbindung

wss://83.137.146.230:4443 -> kein Problem

mqtt://[2a01:1b0:7996:418:83:137:146:230]:1883 -> kein Problem

Mit dem Mosquitto Test Server ebenfalls.

Habe verschiedene Clienten ausprobiert, MQTT-Explorer und Node-Red.

Nun bin ich mit meinem Latein am Ende.

Könnte mir Jemand bestätigen, dass er zu wss://[2a01:1b0:7996:418:83:137:146:230]:4443 eine Verbindung aufbauen kann?
oder ws://[2a01:1b0:7996:418:83:137:146:230]:8080

MfG

Content-ID: 9546522949

Url: https://administrator.de/forum/mqtt-websocket-verbindung-ueber-ipv6-9546522949.html

Ausgedruckt am: 22.12.2024 um 02:12 Uhr

LordGurke
LordGurke 18.02.2024 um 14:37:47 Uhr
Goto Top
Eine Verbindung bekomme ich, aber HTTP-Fehler 400 - vermutlich weil ich irgendwelche Header oder einen Request-Body setzen müsste:


$ curl --verbose -k -H 'Upgrade: websocket' -H 'Connection: upgrade' -H 'Sec-WebSocket-Key: zigD82qT7b5aw88LWTaG0Q==' -H 'Sec-WebSocket-Protocol: mqtt' 'https://[2a01:1b0:7996:418:83:137:146:230]:4443/mqtt' && echo " "  
*   Trying [2a01:1b0:7996:418:83:137:146:230]:4443...
* Connected to 2a01:1b0:7996:418:83:137:146:230 (2a01:1b0:7996:418:83:137:146:230) port 4443
* ALPN: curl offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / X25519 / RSASSA-PSS
* ALPN: server did not agree on a protocol. Uses default.
* Server certificate:
*  subject: CN=demo.flashmq.org
*  start date: Feb 10 22:49:23 2024 GMT
*  expire date: May 10 22:49:22 2024 GMT
*  issuer: C=US; O=Let's Encrypt; CN=R3  
*  SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
*   Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
*   Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
* using HTTP/1.x
> GET /mqtt HTTP/1.1
> Host: [2a01:1b0:7996:418:83:137:146:230]:4443
> User-Agent: curl/8.5.0
> Accept: */*
> Upgrade: websocket
> Connection: upgrade
> Sec-WebSocket-Key: zigD82qT7b5aw88LWTaG0Q==
> Sec-WebSocket-Protocol: mqtt
> 
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
< HTTP/1.1 400 Bad Request
< Sec-WebSocket-Version: 13
* OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 0
* Closing connection
* TLSv1.3 (OUT), TLS alert, close notify (256):


curl: (56) OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 0
11078840001
Lösung 11078840001 18.02.2024 aktualisiert um 15:47:44 Uhr
Goto Top
Naja, der CN des Zertifikat passt dann eben nicht auf die verwendete Domain face-wink. Ist wie wenn du im Browser eine SSL Seite mit einem anderen Namen aufrufst der nicht im Zertifikat vorhanden ist, das musst du erst erlauben indem du "unsichere" Verbindungen dem Client erlaubst.

 mqttui -b "wss://[2a01:1b0:7996:418:83:137:146:230]:4443" --insecure  

Verbindung erfolgreich

screenshot

Ohne den Parameter --insecure wie erwartet der Fehler weil der common name des Servers nicht auf die IPv6 matcht, also völlig normales Verhalten face-wink
Error: Websocket: IO error: presented server name type wasn't supported  

Caused by:
    0: IO error: presented server name type wasn't supported  
    1: presented server name type wasn't supported  
Avenga
Avenga 19.02.2024 um 07:44:13 Uhr
Goto Top
Danke euch.

Ich hatte es mit dem Programm MQTT Explorer probiert, das klappt nach wie vor nicht.
Liegt dann wohl am MQTT Explorer.
Mit Node-Red ebenfalls.

Dann habe ich es mit folgendem JS in html (Browser) probiert:
<script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.min.js"></script>  
<script>
        const clientId = 'Browser_' + Math.random().toString(16).substr(2, 8);  
        client = new Paho.MQTT.Client("2a01:1b0:7996:418:83:137:146:230", Number(8080), clientId);  
        client.onConnectionLost = onConnectionLost;
        client.onMessageArrived = onMessageArrived;
        client.connect({
            onSuccess: onConnect,
            useSSL: false
        });
        function onConnect() {
            console.log("Verbindung hergestellt");  
            client.subscribe("topic/path");  
        }
        function onConnectionLost(responseObject) {
            if (responseObject.errorCode !== 0) {
                console.log("Verbindung verloren:" + responseObject.errorMessage);  
            }
        }
        function onMessageArrived(message) {
            console.log("Beschreibung: " + message.destinationName);  
            console.log("Nachricht: " + message.payloadString);  
        }
</script>
Allerdings mit Port 4443 - das klappte dann wohl nicht wegen dem Zertifikatfehler.
Mit Port 8080 klappt es nun.

Port 4443 werde ich dann vielleicht auch noch mal testen, indem ich die Domain verwende und IPv4 abschalte.
11078840001
11078840001 19.02.2024 aktualisiert um 08:10:12 Uhr
Goto Top
Liegt dann wohl am MQTT Explorer.
Mit Node-Red ebenfalls.
That's by design, die schützen nur die User, wie Browser eben auch.
indem ich die Domain verwende und IPv4 abschalte.
Statt abschalten, eigenen DNS-Server/Proxy verwenden und dort nur einen AAAA Record für die genannte Domain hinterlegen.

Btw. wenn dein Client sowieso eine globale IPv6 Adresse hat sollte er auch per Default IPv6 bevorzugen und auf die IPv6 Adresse verbinden wenn er über die DNS Abfrage der Domain einen AAAA Record geliefert bekommt. Die IPv6 Adresse zu verwenden ist also überflüssig.
Avenga
Avenga 21.02.2024 aktualisiert um 11:38:35 Uhr
Goto Top
Ja, ich habe inzwischen FlashMQ eingerichtet für meine Homepage:

allow_anonymous true

mosquitto_acl_file /home/pi/acl
mosquitto_password_file /home/pi/passwd

listen {
  protocol mqtt
}

listen {
  protocol websockets
}

listen {
  protocol websockets
  fullchain /etc/letsencrypt/live/meinedomain.de/fullchain.pem
  privkey /etc/letsencrypt/live/meinedomain.de/privkey.pem
}

Läuft über wss IPv4 & IPv6:
123