daniel-kun / Albuschat.LogicNodes

This projects contains 'Logic Nodes' that can run on Gira X1 and Gira L1 (devices for KNX building automation / smart home, see https://www.gira.com/en).
MIT License
21 stars 2 forks source link

WebRequest: 998 Unknown error bei Servern, die nur TLS >= 1.2 unterstützen #4

Open martinvonwittich opened 3 years ago

martinvonwittich commented 3 years ago

Ich verzweifle schon seit einer Weile daran, dass ich mit dem WebRequest-Baustein das NINA-API nicht abgerufen bekomme (z. B. https://warnung.bund.de/api31/dashboard/031010000000.json) - der Request funktioniert im Simulator, aber nicht auf dem X1, wo er 998 Unknown error wirft.

Seit kurzem funktioniert jetzt plötzlich auch eine andere Logik nicht mehr, die mit dem WebRequest-Baustein einen eigenen Server abruft, was mich dazu motiviert hat, das Problem jetzt doch mal genauer mit Wireshark zu debuggen. Die Ursache scheint mir zu sein, dass der Request TLS 1.0 verwendet:

Transport Layer Security
    TLSv1 Record Layer: Handshake Protocol: Client Hello
        Content Type: Handshake (22)
        Version: TLS 1.0 (0x0301)
        Length: 75
        Handshake Protocol: Client Hello
            Handshake Type: Client Hello (1)
            Length: 71
            Version: TLS 1.0 (0x0301)
            Random: entfernt
            Session ID Length: 0
            Cipher Suites Length: 12
            Cipher Suites (6 suites)
            Compression Methods Length: 1
            Compression Methods (1 method)
            Extensions Length: 18
            Extension: server_name (len=14)

was der Server mit einem Fatal Alert "Protocol Version" beantwortet:

Transport Layer Security
    TLSv1 Record Layer: Alert (Level: Fatal, Description: Protocol Version)
        Content Type: Alert (21)
        Version: TLS 1.0 (0x0301)
        Length: 2
        Alert Message
            Level: Fatal (2)
            Description: Protocol Version (70)

Ich hab dann mit ssllabs.com die beiden Server gescannt, und in der Tat erzwingen beide TLS >= 1.2. Nachdem ich den privaten Server so umkonfiguriert habe, dass dort auch die alten TLS-Versionen noch funktioniert, geht immerhin die Logik wieder.

Daniels Beitrag im KNX-User-Forum macht mich jetzt natürlich nicht optimistisch, dass sich das tatsächlich beheben lässt ^^

Ich schätze, in der Zwischenzeit wäre aber zumindest ein deutlicher Hinweis in der Doku ganz gut, denn wenn man nur "998 Unknown error" bekommt, hilft einem das ja nicht wirklich weiter, um das eigentliche Problem einzugrenzen. Wenn man weiß, dass modernes TLS nicht funktioniert, kann man ja immerhin seine eigenen Server umkonfigurieren, und für externe APIs einen Proxy z. B. in PHP schreiben.

daniel-kun commented 2 years ago

Hi @martinvonwittich Dieses dumme TLS-Problem macht mich total wahnsinnig, weil viele Nutzer meines Bausteins damit große Probleme haben. Ich habe aber leider keinerlei Einfluss, das zu korrigieren, ohne dass ich sehr viel Aufwand in einen vollständigen neuen Mechanismus investiere, um den Web Request abzusenden. Dafür habe ich leider aktuell bei Weitem keine Kapazität. :-( Hätte ich die Probleme vorher gekannt, die sich auch in den letzten Monaten durch die Entwicklungen im Web noch weiter verstärkt haben, hätte ich HTTPS wahrscheinlich nie freigeschaltet. :-( Tut mir leid, aber ich sehe da aktuell wirklich leider keine Lösung.

martinvonwittich commented 2 years ago

Hi @martinvonwittich Dieses dumme TLS-Problem macht mich total wahnsinnig, weil viele Nutzer meines Bausteins damit große Probleme haben. Ich habe aber leider keinerlei Einfluss, das zu korrigieren, ohne dass ich sehr viel Aufwand in einen vollständigen neuen Mechanismus investiere, um den Web Request abzusenden. Dafür habe ich leider aktuell bei Weitem keine Kapazität. :-( Hätte ich die Probleme vorher gekannt, die sich auch in den letzten Monaten durch die Entwicklungen im Web noch weiter verstärkt haben, hätte ich HTTPS wahrscheinlich nie freigeschaltet. :-( Tut mir leid, aber ich sehe da aktuell wirklich leider keine Lösung.

Ich würde sagen, Schritt 1 ist erst mal, das Problem einfach zu dokumentieren :)

https://github.com/daniel-kun/Albuschat.LogicNodes/pull/6

Hab mich am Anfang wirklich dumm und dämlich gesucht, bis ich kapiert hatte, dass der von .NET nicht sehr hilfreich benannte "Unknown error" durch die TLS-Inkompatibilität verursacht wurde; die Doku erspart das hoffentlich den nächsten Leuten, danach so lange zu suchen.

Schritt 2 wäre für mich die Frage, ob du da irgendwie als Entwickler nen Draht zu Gira hast. Wissen die von dem Problem, und ist da irgendwie in Aussicht, dass die das mit einem Mono-Update o. Ä. fixen können?

Schritt 3 könnte ich mir evtl. irgendwann noch mal die Mühe machen, meinen Workaround mit php-proxy besser zu dokumentieren, wie man sich auf einer Debian-VM eine NGINX-Site auf einem eigenen Port einrichtet, die TLS 1.1 spricht, und die man dann ggf. auch so firewallen kann, dass nur der eigene X1 da ran kann. Das habe ich jetzt bei mir so gemacht, und das scheint bislang gut zu funktionieren.

daniel-kun commented 2 years ago

@martinvonwittich An dieser Stelle auch nochmal danke für deinen PR für die Doku. Ich bin selbst Entwickler bei Gira und habe einen sehr engen Draht zu den Entwicklern vom X1. Die Aktualisierung ist aber nicht so trivial, wegen Abhängigkeiten an den Simulator im GPA, Kompatibilität zu bestehenden Bausteinen, etc. pp., weshalb sie derzeit nicht die höchste Priorität genießt. Außerdem wollte man auch erst einmal .NET 6 abwarten, was ja den bisherigen Wildwuchs jetzt hoffentlich wieder zusammengebracht hat, und das vor wenigen Tagen erst rausgekommen ist. Ich habe das aber intern schon an diversen Stellen platziert (und mache das auch weiter regelmäßig).