Lägga till TLS/SSL i LabVIEW

Av Ulf Nilsson

Jag snubblade in på krypterad TCP-trafik, eller mer specifikt TLS, för över tio år sedan i LabVIEW 2011. En kollega och jag arbetade på ett testsystem som behövde kommunicera med enheter över Ethernet, med hjälp av både TCP/IP och säker krypterad TLS/SSL. Nätverksenheterna fungerade som klienter och vi behövde bygga en server som kunde kommunicera med dem.

Vi började projektet med att lägga till stöd för icke-krypterad TCP-trafik i servern, och när vi sedan såg att kommunikationen fungerade bra lade vi till krypteringsdelen.

Figur 1 Vår nätverksuppsättning

Transport Layer Security, eller förkortat TLS, är ett kryptografiskt protokoll som är utformat för att öka kommunikationssäkerheten i ett datornätverk. Syftet är att tillhandahålla sekretess, integritet och auktoritet mellan två eller flera kommunicerande nätverksenheter.

  • Sekretess: Ingen kan se vad du skickar
  • Integritet: Ingen kan ändra budskapet
  • Auktoritet: Avsändaren och mottagaren är den de utger sig för att vara

Även om jag har arbetat med krypterad kommunikation i över ett decennium betraktade jag mig fortfarande som en amatör när det gäller hur allt fungerar bakom kulisserna. Stöd för TLS kom till LabVIEW 2020, så vi kunde inte använda några inbyggda VI:er för krypteringen på den tiden. Istället fick vi använda både LabVIEW TCP/IP VI:er och Microsoft .NET-kod. Tillsammans med hjälp av Wireshark kunde vi felsöka protokollet i båda lägena.

TCP- och TLS-handskakning

TLS-kommunikationen inleds med en vanlig handskakning av TCP-anslutningen och därefter påbörjas TLS-handskakningen, som bland annat innebär förhandling om vilken TLS-version och cipher suite som ska användas. Server- och klientidentiteten säkerställs med hjälp av digitala certifikat.

Vad behöver vi göra för att använda TLS i LabVIEW? Förutom den faktiska LabVIEW-koden måste vi ha ett digitalt certifikat. Certifikatet kan antingen vara självsignerat eller signerat av en betrodd certifikatutfärdare (CA). Ett självsignerat certifikat skapas, signeras och utfärdas av dig, medan ett CA-certifikat skapas, signeras och utfärdas av en tredjepartsauktoritet som är allmänt betrodd. Certifikat kan köpas och skapas i PowerShell eller verktyg som OpenSSL.

Beroende på nätverks- och säkerhetsmiljön kan TLS-protokollet använda en av två autentiseringsmetoder: serverautentisering eller ömsesidig autentisering. I serverautentiseringsläget är det bara servern som behöver ha ett certifikat och i det ömsesidiga autentiseringsläget behöver även klienten ha det. I vårt fall behövde vi bara hantera serverautentisering.

TLS-certifikat innehåller vanligtvis följande information:

  • Det aktuella domännamnet
  • Ämnesorganisationen
  • Namnet på den utfärdande certifikatutfärdaren
  • Alternativa ämnesdomännamn
  • Utgivningsdatum
  • Utgångsdatum
  • Den publika nyckeln
  • Den digitala signaturen från CA

Använda TLS i LabVIEW

Det finns inget stöd för TLS före LabVIEW version 2020, och om du planerar att använda LabVIEW-versioner före det måste du förlita dig på tredjepartskod för att få det att fungera. Du kan till exempel använda .NET-kod från Microsoft, som vi gjorde.

Kodexemplen nedan visar både server- och klientimplementeringen. Serversidan implementeras med hjälp av Microsoft .NET och klientsidan med inbyggda TLS VI:er. Endast servern är autentiserad med hjälp av ett självsignerat certifikat.

TLS-serverns kod

Koden för TLS-servern börjar med att läsa certifikatfilen för servern och välja nätverkskort och port som den ska börja lyssna på. Sedan väntar den på att en TLS-klient ska ansluta, och när det sker utför den TLS-handskakningen, skickar över en sträng till klienten och stänger anslutningen.

Bild 2. TLS-servern, med hjälp av Microsoft .NET

Initialisering

  1. Läs serverns certifikatfil
  2. Välj nätverks- och portnummer för servern att lyssna på och starta lyssningen

Bild 3. TLS-konfiguration

Ansluta till klienten

  1. Väntar på att en klient ska ansluta
  2. Acceptera TCP-klient
  3. Hämta klientströmmen och starta TLS-förhandlingen mellan klienten och servern
  4. Packa och skicka data till klienten. Stäng klientanslutningen

Figur 4 Autentisera och skicka data när klienten ansluter

Avstängning

I nedstängningsavsnittet i koden stoppas och stängs alla skapade resurser get.

Bild 5. Kod för klient

TLS-klienten

För det här blogginlägget försökte jag skriva klientkoden i LabVIEW med hjälp av .NET-kod, men misslyckades eftersom .NET-koden krävde speciella callbacks, och det var inte möjligt att uppnå i LabVIEW. Istället använde jag de inbyggda LabVIEW TLS VI:erna för klienten.

Klientkoden läser först och markerar servercertifikatet som betrott, så att den kan jämföra det med det som servern skickar över under TLS-handskakningen.

Efter TLS-handskakningen och efter att servercertifikatet har auktoriserats läser klienten ut meddelandet från servern och stänger anslutningen.

Det finns också ett .NET-anrop för att läsa ut och visa Subject-egenskapen i servercertifikatet.

  1. Läs servercertifikatet och lägg till det i lagret med betrodda certifikat
  2. Skapa TLS-anslutningen
  3. Läs fyra byte från strömmen för att få meddelandets storlek
  4. Läs resten av meddelandet
  5. Stäng anslutningen

Bild 6. Kod för klient

Skapa certifikat

Servercertifikatet, i LabVIEW-exemplet, skapas med OpenSSL i Ubuntu och Windows Subsystem for Linux, även känt som WSL. Tyvärr hade den .NET-version som jag använde i LabVIEW inte stöd för att certifikat och privat nyckel lagras i två separata filer (PEM-format), så jag var tvungen att kombinera dem till en enda fil som heter p12. LabVIEW TLS VIs kan dock inte hantera den filtypen, så för klienten var jag tvungen att använda PEM-filen för certifikatet.

Bild 7. Skapa certifikatfil med OpenSSL i Ubuntu

Följande två kommandon skapar de filer som behövs:

openssl req -x509 -sha256 -newkey rsa:2048 -keyout key.pem -out cert.per -days 3650

openssl pkcs12 -export -out certifikat.p12 -inkey nyckel.pem -in cert.pem