Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

CmpCrypto

Stefan2
2018-05-30
2018-06-14
  • Stefan2 - 2018-05-30

    Hallo,

    ich will meine MQTT Bibliothek mit TLS erweitern, jedoch meint der Bibliotheksverwalter, das die CmpCrypto Bibliothek nicht installiert wäre.
    Diese kann ich aber dem Projekt hinzufügen, ist also vorhanden, siehe Anhang.

    Wie komme ich dem bei?

    Grüße Stefan

    IMG: cmpcrypto.png

     
  • Stefan2 - 2018-06-01

    Hallo,

    ich bin ein bisschen weiter, die CmpTls Bibliothek empfiehlt ja das nutzen der SysSocket2 Bibliothek für die TLS Kommunikation per TCP.

    Ich konnte das Projekt für die nicht verschlüsselte Kommunikation schon auf SysSocket2 umstellen.
    Nun will ich TLS aktivieren, dazu schein die Funktion SysSocket2.SysSock2Create im Eingang pParameter ein SysSocket2_Tls_Sockets bekommen zu wollen. Dies ist vom Typ ein RTS_IEC_HANDLE.
    Annahme: bekomme ich das Handle von CmpTls.CmpTlsCreateContext.

    Ist das korrekt? Die Dokumentation schweigt sich dazu leider etwas aus.

    Falls ja, bin ich wieder bei dem im ersten Post beschriebenen Problem, das angeblich CmpCrypto nicht installiert währe.

    Über Unterstützung dazu würde ich mich sehr freuen, sodass meine MQTT Bibliothek auch TLS kann.

    Vielen Dank im Vorraus.

    Stefan

     
  • Stefan2 - 2018-06-01

    Hallo,

    Ich habe gerade auf dem Screenshot gesehen, das die Bibliotheksversionen unterschiedlich sind, da habe ich mi Version 3.5.10.0 und 3.5.11.0 rumgespielt um den Fehler weg zu bekommen, hat aber nichts geholfen. Bei beiden Versionen kommt die Fehlermeldung.

    Grüße Stefan

     
  • Stefan2 - 2018-06-01

    Hallo,

    ich versuche weiter...

    Bei einem Aufruf von:

           SysSockSpec.tlsSockets.hTlsContext := CmpTls.CmpTlsCreateContext(
             hCert:= RTS_INVALID_HANDLE, 
             tlsMethod:= CmpTlsMethod.TLSv2_CLIENT, 
             cipherList:= 0,
             verifyMode := CmpTlsConstants.TLS_VERIFY_PEER,
             pResult:= ADR(pResult)); 
    

    steht danach in pResult eine 1 was wohl General error bedeutet.

    Weiter steht im Log des RASPIs:

    TlsCreatContext2: Failed to save context. Komponente CmpOpenSSL.

    Kann da einer Helfen?

    Grüße Stefan

     
  • Stefan2 - 2018-06-04

    Hallo,

    nächste Runde...

    CmpTls.CmpTlsCreateContext()

    Funktioniert jetzt, ich weiß zwar nicht genau warum, könnte mir aber denken, das wegen Exzessiven Aufrufen der Funktion ohne wieder Freigeben des RAMs dafür, dieser einfach irgendwann alle war.

    So, dafür hänge ich jetzt an

    SysSock2Connect() und wirft mir einen Fehler 16#1, diesmal ohne Eintrag im LOG.

    Ideen?

    Grüße Stefan

     
  • Stefan2 - 2018-06-06

    Hallo,

    es geht fleißig weiter. Dank Wireshark auf dem Raspi habe ich herausgefunden, das ich von Server zu viel will, und dieser keine Diffie-Hellmann Schlüsselaustausch kann. Soll konkret heißen, in meinem Client-Hello Paket sind nur cipher aufgelistet, die der Server nicht kann. Deswegen bekomme ich vom Server einen Handshake Error, was dieser erstmal richtig macht. Dieser Fehler wird dann an SysSock2Connect() durchgereicht. So, nun habe ich mir gedacht, biete ich dem Server ein cipher an den dieser kann, also Nachgeschaut, bei der Funktion CmpTlsCreateContext() kann man einen Parameter cipherList mit über geben. Das soll ein Pointer auf String sein(Pointer to string). Ein Pointer auf einen String mit dem Inhalt 'TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA' was der Server kann führte zu einem pResult von 16#1.

    Nun zu der Frage: welches Format muss dieser String haben, damit er entsprechende cipher annimmt?

    Leider schweigt sich die Doku dazu aus.

    Vielen Dank im Vorraus,

    Stefan

     
  • Stefan2 - 2018-06-10

    Hallo,

    natürlich habe ich weiter gemacht...

    ich habe bei Google "codesys cipher list" eingegeben, und dabei kommt man auf folgenden Eintrag:

    https://forum.codesys.com/viewtopic.php?t=8355#p19754

    Aha, also openssl. Also nach openssl cipher list gesucht und auch gut dokumentiert gefunden. Und was da Dokumentiert ist, wird auch von CmpTlsCreateContext() akzeptiert. Sehr fein. Würde einiges an Zeit sparen, wenn man das in der Doku der Bibliothek mit ablegt. Wobei sich noch die frage stellt, ob das auch das Richtige ist, vielleicht nur Glück gehapt, und es ist ganz anders?

    Naja, ging dann weiter, immer noch keine Verbindung, laut Wireshark "Alert Level: Fatal Certificate Unknown"... hmm was das jetzt.

    Mal bei der Janz tec MQTT Bibliothek nachgeschaut, die kann das ja schon. Da steht unter:

    https://store.codesys.com/janz-tec-mqtt-library.html#System%20Requirements

     https://store.codesys.com/janz-tec-mqtt-library.html#System Requirements 
    

    das anscheinend die CmpTls Bibliothek noch nicht mit Zertifikaten umgehen kann. Steht natürlich nirgens, und auf den verlinkten Bug Tracker komme ich auch nicht. Also wie bekommt man bescheid das das jetzt geht?

    Nun ich habe dann bei CmpTlsCreateContext() die cipherList auf "MEDIUM" eingestellt und verifyMode auf "CmpTlsConstants.TLS_VERIFY_CLIENT_ONCE" und erhalte nun eine Verschlüsselte Verbindung, leider nicht stark Verschlüsselt, aber das wird vielleicht irgendwann, wenn das CmpTls implementiert.

    Also, ich hab das mal niedergeschrieben, falls weitere Probleme haben die CmpTls Bibliothek zu nutzen. Hoffentlich ist das vielleicht ein kleiner Hinweis die Doku der CmpTls zu verbessern, sodass man nicht so viel selber heraussuchen muss. So Funktioniert es ja stabil, wenn man es richtig einstellt.

    Ach ja, der Fehler das CmpCrypto nicht installiert währe ist immer noch da, geht aber trotzdem....

    Grüße Stefan

     
  • eschwellinger

    eschwellinger - 2018-06-13

    Hi,
    es sollte mit 3.5SP13 release in der online Hilfe auftauchen.
    Es gibt dann auch ein Beispielprojekt dazu.

    Grüße
    Edwin

    IMG: Crypto.jpg

     
  • Stefan2 - 2018-06-13

    Hallo Edwin,

    danke für die Rückmeldung, wie das Grundsätzliche Verschlüsseln funktioniert war mir schon klar, aber sicherlich Interessant für Einsteiger.

    Was mich nur stört, ist das in den Bibliotheken kein Zusammenhang der Abhänigkeiten oder Typen erkennbar ist. Z.b. das SysSocket2.SysSock2Create() für TLS ein von CmpTls.CmpTlsCreateContext() erzeugtes Handle möchte. Also, so funktioniert das zumindest bei mir. Leider weis ich ja nicht, ob das genau so gedacht war.

    Oder meine Annahme das CmpTlsCreateContext() mit den Angaben von:
    https://www.openssl.org/docs/man1.0.2/apps/ciphers.html
    rechnet.

    Hier eine genaue Beschreibung und schon reduziert sich die Hemmschwelle und der Aufwand TLS zu nutzen.

    Wenn man das nämlich alles weiß, ist es ja recht simpel mit SysSocket2 eine TLS Verbindung zu realisieren, das gefällt mir schon sehr!

    Was hat immer noch ein Phänomen ist, ist das CmpCrypto fehlen würden, aber ich denke das wird noch.

    Für mich stellt sich noch die Frage ob und wann CmpTls in der Lage ist, mit Zertifikaten umzugehen und eventuell eine Certificate authority anzusprechen. Dann könnte man sich ein Zertifikat von LetsEncrypt holen und sich sehr freuen!

    Und wie würde ich das mitbekommen, das das geht?

    Ok, ich freue mich auf 3.5SP13 und auf das Beispielprojekt, mal sehen was es da für neues gibt.

    Dazu was ganz anderes: 3S nutzt doch sicherlich auch Test Cases Bibliotheken für die Validierung und Test der Funktion Ihrer Bibliotheken.

    Wären diese nicht die Perfekten Beispiele für die Nutzung der Bibliotheken?

    Vielen Dank

    Grüße Stefan

     
  • eschwellinger

    eschwellinger - 2018-06-14

    Hallo,
    das wird nun doch als Store Beispiel Applikation kommen.
    (auch für TLS ist gelplant ein Beispiel im Store zu haben)
    Grüße
    Edwin

     

Log in to post a comment.