RSA Key and IV exchange failing, not found

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Paul Sinnema
    Smart Home'r
    • 29.12.2015
    • 54

    RSA Key and IV exchange failing, not found

    Hallo,

    Ich versuche mit Windows 10 IoT Core und C# eine Verbindung zu machen mit dem Miniserver aber es gelingt mir eben nicht. Unten alle code welche ich bis jetzt geschrieben habe. Einig funktioniert aber de Schritt wo der Client ein KeyExchange machen sollte funktioniert nicht (not found).

    Wenn ich das laufen lasse bekomme ich folgendes:

    Sending to http://192.168.1.200/jdev/sys/getPublicKey/ =>
    Content: {"LL": { "control": "dev/sys/getPublicKey/", "value": "-----BEGIN CERTIFICATE-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDTEBiUtYNiGl rRZm184J5buRR/MYPNMR0eIPfOseIskiJkvDqXQ75YlU+3M6/zEAy1IVunc5yPoVFMESg4C+mCXrtLnJxTuSucEmpGMgycoDCZi o/maOKHRJQtoTAYQJ1C55N2OmFDAy5nHDfpQX1wDo79o1TZo7xa+ mrWRBOjHQIDAQAB-----END CERTIFICATE-----", "Code": "200"}}
    Socket opened
    Sending to http://192.168.1.200/jdev/sys/keyexchange/ => G2fUypak2bQUabMcuWetSwclkiPQcoc6sjMIMTPoddTkxxnT3N 05DA5kxypIVu1Koc3NPMbM8lLiuHQrDpq6SiMJysQeeWHXDBIs JRf8fquqjQjsL4khf3FiPZ8oBiPKQCjzWAZv4nLpiauOid7+8D 3Qu4v4bsVCuxfX0kybCms2eJJuCIq6IuGW0af0uJcE92bz2/sloVPsFAC/NHRBfFeRd8LmqLnQthT1+ARCSWldznG3Zh7OHzwPLa/iXXqFGr9RhmMNYMWXJi1BZ7CgUGoSlxZ3tjigTyngYrgwFGIAx YQeNH3JlY0SaQF/Rdr9OQPU+ZJzpt11EooBHjOP7+2+YGSnqmCBzGm+9m6Z6WBByX/ZJ2FQ4maXPeX+vbo9
    Content: <html><head><title>error</title></head><body><errorcode>404</errorcode> <errordetail>Not Found</errordetail></body></html>
    Sending to http://192.168.1.200/jdev/cfg/api/authenticate/ =>
    Content: {"LL": { "control": "dev/cfg/api/authenticate/", "value": "{'snr': 'EE:E0:00:48:00:5C', 'version':'10.0.9.24'}", "Code": "200"}}
    Socket closed:

    Also ein public key bekomme ich schon. Socket wird auch geöffnet aber demnächst wieder geschlossen weil der 'keyexchange' fehlgeschlagen ist. Es gibt so viele möglichkeiten es falsch zu machen aber nur eine Lösung welche funktioniert. Dokus sind auch sehr begrenzt. Wer kann mir weiter helfen?

    Hier ist der Code:

    using Newtonsoft.Json.Linq;
    using System;
    using System.Diagnostics;
    using System.Linq;
    using System.Net.Http;
    using System.Security.Cryptography;
    using System.Text;
    using System.Threading.Tasks;
    using TGBGateway.Viewmodel;
    using WebSocketSharp;
    using Windows.ApplicationModel.Resources.Core;
    using Windows.UI.Xaml.Controls;

    namespace TGBGateway
    {
    public sealed partial class MainPage : Page
    {
    private const string m_Host = "192.168.1.200";
    private const int m_Port = 80;

    private static readonly string m_WsRfc6455 = $"ws://{m_Host}:{m_Port}/ws/rfc6455";
    private static readonly string m_ApiBaseUrl = $"http://{m_Host}:{m_Port}/jdev/cfg/api/";
    private static readonly string m_SpsBaseUrl = $"http://{m_Host}:{m_Port}/jdev/sps/";
    private static readonly string m_SysBaseUrl = $"http://{m_Host}:{m_Port}/jdev/sys/";
    private static readonly string m_GetkeyUrl = $"{m_SysBaseUrl}getPublicKey/";
    private static readonly string m_keyExchangeUrl = $"{m_SysBaseUrl}keyexchange/";
    private static readonly string m_AuthenticateUrl = $"{m_ApiBaseUrl}authenticate/";
    private static readonly string m_EnableBinStatusUpdate = $"{m_SpsBaseUrl}enablebinstatusupdate";

    private readonly Uri m_WsRfc6455Uri;
    private readonly Uri m_GetkeyUri;
    private readonly Uri m_KeyExchangeUri;

    private string UserId => Parameter("UserId");
    private string Password => Parameter("Password");

    private WebSocket socket;
    private byte[] m_PublicKey;
    private AesManaged m_AesManaged = new AesManaged();
    private RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();


    struct LoxoneHeaderDef
    {
    byte cBinType; // fix 0x03
    byte cIdentifier; // 8-Bit Unsigned Integer (little endian)
    byte cInfo; // Info
    byte cReserved; // reserved
    uint nLen; // 32-Bit Unsigned Integer (little endian)
    };

    public MainPage()
    {
    this.InitializeComponent();

    this.DataContext = new SettingViewmodel();

    m_WsRfc6455Uri = new Uri(m_WsRfc6455);
    m_GetkeyUri = new Uri($"{m_GetkeyUrl}");
    m_KeyExchangeUri = new Uri(m_keyExchangeUrl);

    Task task = Task.Run(async () => await StartServer());
    }

    private string Parameter(string id)
    {
    var subtree = ResourceManager.Current.MainResourceMap.GetSubtree ("Constants");
    var result = subtree.GetValue(id, ResourceContext.GetForViewIndependentUse());
    return result.ValueAsString;
    }

    /// <summary>
    /// Start listening
    /// </summary>
    private async Task StartServer()
    {
    try
    {
    m_PublicKey = await GetPublicKeyFromLoxone();

    socket = new WebSocket(m_WsRfc6455, "remotecontrol");

    socket.SetCredentials(UserId, Password, true);

    socket.OnMessage += Client_OnMessage;
    socket.OnError += Socket_OnError;
    socket.OnClose += Socket_OnClose;
    socket.OnOpen += Socket_OnOpen;

    socket.Connect();

    // socket.Send(EnableBinStatusUpdate); // Get NOT FOUND

    await ExchangeKeysWithLoxone(); // Get NOT FOUND

    await AuthenticateWithLoxone();
    }
    catch (Exception ex)
    {
    Debug.WriteLine($"Error occured: {ex.Message}");
    throw ex;
    }
    }

    /// <summary>
    /// Called upon opening the socket
    /// </summary>
    private void Socket_OnOpen(object sender, EventArgs e)
    {
    Debug.WriteLine($"Socket opened");
    }

    /// <summary>
    /// Called after the socket was closed
    /// </summary>
    private void Socket_OnClose(object sender, CloseEventArgs e)
    {
    Debug.WriteLine($"Socket closed: {e.Reason}");
    }

    /// <summary>
    /// Called on error (never gets called??)
    /// </summary>
    private void Socket_OnError(object sender, ErrorEventArgs e)
    {
    Debug.WriteLine($"Socket error: {e.Message}");
    }

    /// <summary>
    /// Called on receiving a message
    /// </summary>
    private void Client_OnMessage(object sender, MessageEventArgs e)
    {
    Debug.WriteLine(e.Data);
    }

    /// <summary>
    /// Authenticate with the miniserver.
    /// </summary>
    private async Task AuthenticateWithLoxone()
    {
    var authenticateUri = new Uri($"{m_AuthenticateUrl}");

    var result = await SendHttpMessage(authenticateUri, string.Empty, true);
    }

    /// <summary>
    /// Exchange my Key and IV with the miniserver
    /// </summary>
    private async Task ExchangeKeysWithLoxone()
    {
    RSAParameters rsaKeyInfo = rsa.ExportParameters(false);

    rsaKeyInfo.Modulus = m_PublicKey;

    rsa.ImportParameters(rsaKeyInfo);

    var encrypted = rsa.Encrypt($"{m_AesManaged.Key}:{m_AesManaged.IV} ".Select(chr => (byte)chr).ToArray(), false);

    var message = Convert.ToBase64String(encrypted);

    await SendHttpMessage(m_KeyExchangeUri, message);
    }

    /// <summary>
    /// Get the public key from the miniserver
    /// </summary>
    private async Task<byte[]> GetPublicKeyFromLoxone()
    {
    // Get a key from the mini server
    HttpResponseMessage result = await SendHttpMessage(m_GetkeyUri, string.Empty);

    // Get the answer from the mini server
    var json = await result.Content.ReadAsStringAsync();

    // Parse the received string into a JSON object
    dynamic keypacket = JObject.Parse(json);

    // Get the 'LL' part from the JSON (result is a JSON)
    JObject LL = (dynamic)keypacket["LL"];

    // Get the hashkey (value) from the JSON
    var publicKeyString = (string)LL["value"];

    publicKeyString = publicKeyString.Replace("-----BEGIN CERTIFICATE-----", String.Empty).Replace("-----END CERTIFICATE-----", string.Empty);

    var plainTextBytes = Encoding.UTF8.GetBytes(publicKeyString);

    // return publicKeyString.Select(chr => (byte)chr).ToArray();

    // Convert it into a Base64 byte array
    return Convert.ToBase64String(plainTextBytes).Select(chr => (byte)chr).ToArray();
    }

    /// <summary>
    /// Send a request to the miniserver
    /// </summary>
    private async Task<HttpResponseMessage> SendHttpMessage(Uri uri, string message, bool withCredentials = false)
    {
    try
    {
    HttpClient client = new HttpClient
    {
    BaseAddress = uri
    };

    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, message);

    if (withCredentials)
    {
    request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(
    "Basic",
    Convert.ToBase64String(Encoding.ASCII.GetBytes($"{ UserId}:{Password}")));
    }

    Debug.WriteLine($"Sending to {uri.AbsoluteUri} => {message}");
    var result = await client.SendAsync(request);

    var content = await result.Content.ReadAsStringAsync();

    Debug.WriteLine($"Content: {content}");

    return result;
    }
    catch (Exception ex)
    {
    Debug.WriteLine($"Sending failed. Message{ex.Message}");
    throw;
    }
    }
    }
    }
    Zuletzt geändert von Paul Sinnema; 06.01.2019, 13:57.
  • Christian Fenzl
    Lebende Foren Legende
    • 31.08.2015
    • 11192

    #2
    Doku ist schlecht.
    Eine der Fehlerquellen war bei mir das hier:
    https://github.com/mschlenstedt/Loxb.../token.php#L49 Nämlich, dass das Zertifikat für OpenSSL mit anderem Zertifikatshead daherkommt.
    Das kann, muss aber nicht, einer der 100 Fehler sein, die man machen kann.

    Bei meinem PHP ist es übrigens so, dass ich einen Command mit Token-Auth absetzen kann, der zweite schlägt fehl. Das Script funktioniert also leider auch nicht richtig. Die Doku ist wirklich nicht gut - sie hat gar kein Beispiel, wie ein Request mit bestehendem Token aussieht...
    Zuletzt geändert von Christian Fenzl; 06.01.2019, 15:01.
    Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

    Kommentar

    • Paul Sinnema
      Smart Home'r
      • 29.12.2015
      • 54

      #3
      Zitat von Christian Fenzl
      Doku ist schlecht.
      Eine der Fehlerquellen war bei mir das hier:
      https://github.com/mschlenstedt/Loxb.../token.php#L49 Nämlich, dass das Zertifikat für OpenSSL mit anderem Zertifikatshead daherkommt.
      Das kann, muss aber nicht, einer der 100 Fehler sein, die man machen kann.

      Bei meinem PHP ist es übrigens so, dass ich einen Command mit Token-Auth absetzen kann, der zweite schlägt fehl. Das Script funktioniert also leider auch nicht richtig. Die Doku ist wirklich nicht gut - sie hat gar kein Beispiel, wie ein Request mit bestehendem Token aussieht...
      Ich glaube sogar das die Schnittstelle nicht mehr übereinstimmt mit der Doku. Gibt es diesen 'keyexchange' überhaupt noch?

      Kommentar

      • Christian Fenzl
        Lebende Foren Legende
        • 31.08.2015
        • 11192

        #4
        Meine Versuche sind fast ein halbes Jahr her. Ich hab mich mindestens eine Woche intensiv mit dem Code auseinandergesetzt, aber schließlich das Handtuch geworfen, weil der frisch abgeholte Token danach einfach nicht funktioniert hat. Soviel sollte sich aber nicht geändert haben.
        Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

        Kommentar

        • Paul Sinnema
          Smart Home'r
          • 29.12.2015
          • 54

          #5
          Habe es aufgegeben. Auch Loxone wil mir nicht weiter helfen.

          Kommentar

          • Gast

            #6
            Guten Tag zusammen,

            Ich habe mich auch an die Doku gehalten und bin nach mehreren Tagen auch endlich zum Punkt gekommen um mit Loxone den SessionKey auszutauschen.
            Leider gibt mir wie bei euch auch Loxone eine 404 Antwort. Wenn ich das Debug-Info Tool im Loxone -Config benutze wird mir der eingegangen http request auch angezeigt.
            Hierbei wird festgestellt dass der Befehl nicht existiert und eine Liste der möglichen Befehle dargestellt. Dort taucht er auch in keinster Weise auf.
            Nun wird ja selbst in der 10.0 Doku immer noch dieser Befehl angezeigt also müsste es den geben. oder haben die das Verfahren überarbeitet und nichts aktualisiert. https://github.com/mschlenstedt/Loxb.../token.php#L49 war eine sehr gute Hilfe aber wie wird der
            SessionKey zu Loxone übertragen?
            Eine Recherche ergab, dass ja von vielen befürwortet wird, dass Loxberry eine einzige Websocket-Verbindung öffnet und darüber dann die Module kommunizieren.
            Also muss es ja möglich sein eine Websocket-Verbindung mit dem in der API angegebenen Weg zu erstellen und mit Token zu authentifizieren.

            PS:Ich arbeite mich seit mehreren Tagen doch recht intensiv in das Thema ein, da sieht man schnell den Wald vor lauter Bäumen nicht mehr.
            Würde mich also über eine Korrektur oder passende Quellen freuen

            Schöne Feiertage

            Kommentar

            • Bluebrain
              Smart Home'r
              • 18.10.2015
              • 77

              #7
              Hallo leidgeplagte Kollegen!

              Durch das, was Anfangs noch einfach oder zumindest recht überschaubar und Schritt für Schritt abarbeitbar erschien, beschäftigt mich nun auch schon seit einigen Stunden.
              Die Doku ist eine einzige Frechheit!
              Wäre es wirklich zu viel verlangt gewesen, ein einfaches Beispiel inkl. Keys, Requests und Resonds, etc. anzufügen, damit man zumindest nachprüfen kann, ob der eigene Programmier-/Rechenweg korrekt ist?

              Allein die wilde und oft gar nicht dokukmentierte(!) Mischung aus HEX, Binary, Base64 und URL-Encoded macht einen Wahnsinnig.
              Einmal muss man den Salt als HEX-String verwenden, dann wieder in Binary-Form, ...

              Aber zumindest eines kann ich euch sagen:
              jdev/sys/keyexchange funktioniert nur über eine Websocket-Verbindung, nicht über einen HTTP Request!!!

              Wenn ich die Doku richtig interpretiere (da ist leider viel Interpretationsspielraum ), dann muss ein HTTP Request anders erfolgen - ohne Keyexchange.

              1.) von jdev/sys/getkey2/{user} temporären key und salt vom user holen (warum bekommt man da eigentlich auch eine Antwort bei nicht existierenden Usernamen???)
              2.) Uppercase SHA1 hash aus {password}:{salt_hex}
              3.) hmac_sha1 aus {user}:{in Schritt 2 berechneter hash} (diesmal aber nicht Uppercase)
              4.) Command vorbereiten: jdev/sys/gettoken/$hash/$user/$permission/$uuid/$info
              z.B. jdev/sys/gettoken/410b.....31/alexa/4/098802e1-02b4-603c-ffffeee000d80c00/Testserver
              5.) 2-Byte Salt in Hex ausdenken, z.B. 1122
              $message = salt/$salt2/$cmd
              z.B: salt/1122/jdev/sys/gettoken/410b.....31/alexa/4/098802e1-02b4-603c-ffffeee000d80c00/Testserver
              6.) AES Key und iv ausdenken und damit $message (siehe Schritt 5) verschlüsseln (aufpassen! AES Verschlüsseldung mit Zero-Padding!)
              Das ganze Base64 encodieren und noch "URI escapen"


              jetzt kommt der Teil, der den keyexchange ersetzt:

              7.) payload: {eigener AES key}:{eigener AES iv}
              und das mit RSA und dem Public Key vom Miniserver verschlüsseln, in Base64 encodieren und auch URI-escapen
              das ist dann der "session_key"


              8.) das ganze dann so an den Miniserver schicken:
              http://miniserver_ip/jdev/sys/enc/{encodiertes_Zeug_aus_Schritt_6}?sk={session_key}

              ABER:
              Auch bei mir funktioniert es leider nicht!
              Beim letzten Schritt bekomme ich gar keine "vernünftige" Fehlermeldung vom Miniserver, sondern der Miniserver verlangt beim Aufruf von http://miniserver_ip/jdev/sys/enc/... eine HTTP BASIC Authentifizierung!!!
              (gültiger Benutzername und Passwort funktionieren aber auch nicht)


              Leider stehe ich hier auch an.

              Kommentar

              • Bluebrain
                Smart Home'r
                • 18.10.2015
                • 77

                #8
                Das war ja wieder klar! ​​​​​

                Nach zig Stunden, aber nur 20 Min. nach dem ich den Post oberbei geschrieben haben, hatte ich nun endlich Erfolg und so einen sch*iß verdammten Token vom Minisuffer erhalten!
                Ich habe ja sonst nichts zu tun um 06:00 Uhr Früh!

                Der Fehler lag bzw. liegt bei mir im letzten Schritt, der RSA Verschlüsselung von {AESkey}:{AESiv}
                Da muss in meinem Programm noch ein Fehler sein.
                Da sich das Ergebnis der RSA Verschlüsselung ja jedes Mal ändert, war das halt auch nicht so einfach zu überprüfen, wie einfache Hashes.

                Nachdem ich mein {AESkey}:{AESiv} Paar auf https://www.devglan.com/online-tools...ion-decryption verschlüsselt hatte, funktionierte es!
                (Public Key ohne -----BEGIN ... und END--- eingeben! Nur den Base64 Teil dazwischen.)

                Aber jetzt weiß ich zumindest, an welcher Stelle ich suchen muss und werde das wohl auch noch hinbekommen.
                Vermutlich stimmt irgendein Parameter für die RSA Verschlüsselung nicht - da gibt es ja verschiedene Arten.

                Ich hoffe, ich konnte jemand anderem weiterhelfen.
                Wenn ihr Fragen habt, helfe ich euch gerne.
                Jetzt gehe ich aber mal bisschen schlafen.

                P.S. Fehler bei mir gefunden:
                Bei der RSA Verschlüsseldung wurde das Default-Padding "oaep" verwendet, anstatt "PKCS1", bei mir (Perl Modul Crypt::PK::RSA) die Option "v1.5".
                $session_key = $pub->encrypt($message, 'v1.5');
                Zuletzt geändert von Bluebrain; 31.12.2019, 06:06.

                Kommentar

                • Christian Fenzl
                  Lebende Foren Legende
                  • 31.08.2015
                  • 11192

                  #9
                  Zu lange her, um dir gedanklich zu folgen 😜
                  Aber wenn du ein funktionierendes Beispiel hast, bin ich daran sehr interessiert 🙂
                  Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

                  Kommentar

                  • Bluebrain
                    Smart Home'r
                    • 18.10.2015
                    • 77

                    #10
                    Ist in Perl programmiert.
                    Aber auch wenn man sich in Perl nicht auskennt, sollte es für einen Programmierer gut lesbar sein, was in dem Programm passiert.

                    Ich räume den Haufen noch ein bisschen auf, was ich da programmiert habe, füge noch ein paar Kommentare ein, und poste es dann.

                    Kommentar

                    • Prof.Mobilux
                      Supermoderator
                      • 25.08.2015
                      • 4586

                      #11
                      Kennt ihr das hier? https://github.com/Loxone/lxcommunicator

                      This module exposes all necessary modules to establish a secure and encrypted connection to a Loxone Miniserver.
                      LxCommunicator can be installed using npm (npm i lxcommunicator) or bower (bower install lxcommunicator)
                      Stammt von Loxone selbst. Gibt's auch als .Net Klassen.
                      Zuletzt geändert von Prof.Mobilux; 31.12.2019, 08:43.
                      🇺🇦 Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine


                      LoxBerry - Beyond the Limits

                      Kommentar


                      • Bluebrain
                        Bluebrain kommentierte
                        Kommentar bearbeiten
                        Das habe ich auch schon ausprobiert und habe noch ein paar Debug-Ausgaben dazuprogrammiert.
                        Hat mir dann zumindest geholfen festzustellen, dass beim ersten Hash der Salt in HEX-Forum verwendet werden muss.
                    • Stefan244
                      Smart Home'r
                      • 10.09.2015
                      • 56

                      #12
                      Ich habe es vor einiger Zeit in Python implementiert: https://github.com/StefanHaring/E2Lo...ocketclient.py, (falls es jemanden hilft)
                      Funktioniert bis dato einwandfrei, aktualisiert den Token aber nicht zyklisch, da mein Client nie so lange aktiv ist.

                      Kommentar

                      • Christian Fenzl
                        Lebende Foren Legende
                        • 31.08.2015
                        • 11192

                        #13
                        Prof.Mobilux
                        Kennen wir - verwendet aber eine Crypto-Lib, die du erst mal in anderen Sprachen nachbauen musst, wennst nicht in node.js entwickeln willst.
                        Das hat bei meinem damaligen Versuch ja schon damit angefangen, dass die OpenSSL-Zertifikate nicht kompatibel sind... Die Lib macht halt alles, was du in anderen Sprachen Stück für Stück zusammenpatche musst. Deswegen ist der lxcommunicator-Code auch nicht sehr aufschlussreich 🙁
                        Zuletzt geändert von Christian Fenzl; 31.12.2019, 10:54.
                        Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

                        Kommentar

                        • Bluebrain
                          Smart Home'r
                          • 18.10.2015
                          • 77

                          #14
                          So, hier mein funktionierendes Programm zum Abruf eines Tokens.

                          Eine komplizierte Doku haben wir ja schon.
                          Also ganz einfach, mit vielen Kommentaren und in Deutsch.



                          Zumindest die einzelnen Schritte und vor allem worauf besonders zu achten ist, sollte auch für nicht Perl-Programmierer lesbar sein.
                          Und nachdem Perl auf jedem (Linux-) Server i.d.R. schon drauf ist, und die fehlenden Module mit CPAN schnell zu installieren sind, sollte es auch einfach sein, das zum laufen zu bekommen.
                          Anzupassen sind dann eigentlich nur IP Adresse, Benutzername und Passwort.
                          Mein Programm gibt jeden Schritt aus, was bei der Fehlersuche hilfreich sein kann, um es ggf. mit den eigenen Ergebnissen in einem anderen Programm/Programmiersprache zu vergleichen.

                          Ich hoffe, es hilft anderen, um nicht auch sinnlose Stunden mit der mageren und unvollständigen Doku von Loxone zu verschwenden.

                          Kommentar

                        • Bluebrain
                          Smart Home'r
                          • 18.10.2015
                          • 77

                          #15
                          Noch ein Hinweis:
                          Nach dem Abruf des Tokens, muss die Authentifizierung mit dem Token innerhalb von ein paar Sekunden erfolgen, sonst gibt es wieder einen Error 401.

                          Authentifizierung und Steuerung funktioniert bei mir nun über Websocket.

                          Was ich jedoch nicht zum laufen bekomme, ist z.B. "checktoken" und "killtoken".
                          Egal, ob ich es als verschlüsseltes Kommando sende oder unverschlüsselt, kommt ein Fehler.

                          Code:
                          sending: jdev/sys/checktoken/f7978c68f95cc3c453eac5a3f93bbb28f246d5f4/alexa
                          {
                            "LL": {
                              "control": "dev/sys/checktoken/f7978c68f95cc3c453eac5a3f93bbb28f246d5f4/alexa",
                              "value": "alexa",
                              "Code": "400"
                            }
                          }
                          Code:
                          sending: jdev/sys/enc/W7OApkNeG2mZZQloQAXzyir4jC0u2Qvdg9QviyKADIZxBKwEL6Nyt1BNWSEOtNPjHBCppWyMFKIbCKnRAtSQkihD4OSM3ryq4LDy%2B%2BUvo7s%3D
                          {
                            "LL":{
                              "control":"dev/sys/killtoken/f7978c68f95cc3c453eac5a3f93bbb28f246d5f4/alexa",
                              "value":{},
                              "code":"401"
                            }
                          }
                          Meine Verschlüsselung bzw. die Entschlüsselung im MiniServer funktioniert auch, sonst könnte der Miniserver in seiner Antwort ja nicht den entschlüsselten Befehl (dev/sys/killtoken/...) anzeigen.

                          Und der Token ist auch nach wie vor gültig!
                          Sende ich danach noch z.B. einen Steuerungsbefehl, wird dieser korrekt ausgeführt. Auch ggf. mehrmals hintereinander.

                          Code:
                          sending: jdev/sps/io/VIBueroSpots/Impuls
                          {"LL": { "control": "dev/sps/io/VIBueroSpots/Impuls", "value": "1", "Code": "200"}}


                          Nun könnte man ja meinen, dass der Token-Hash nicht korrekt ist.
                          Aber dann würde authwithtoken ja auch nicht funktionieren. Darin wird ja der gleiche Hash verwendet.
                          ich sende ja eigentlich nur

                          checktoken/{hash}/{user}
                          statt
                          authwithtoken/{hash}/{user}
                          Zuletzt geändert von Bluebrain; 01.01.2020, 03:48.

                          Kommentar


                          • Christian Fenzl
                            Christian Fenzl kommentierte
                            Kommentar bearbeiten
                            Vielleicht war meine PHP-Implementierung gar nicht so falsch. Was ich nämlich nicht gemacht hab, war nach dem Token holen sofort damit einen Command abzusetzen.
                            Ich hatte den Token immer als File gespeichert und dann mit einem anderen Script weiterverwendet. Da könnte ich in dieses 401er Timeout gefallen sein.
                            Ich freu mich schon auf deinen Code! Heute bin ich allerdings nicht mehr fähig 🥂🍷🍷🍷😜
                        Lädt...