Använda wolfSSL för TLS-anslutningar
Azure Sphere SDK innehåller en delmängd av wolfSSL-biblioteket för TLS (Transport Layer Security), som högnivåprogram kan använda för att skapa säkra TLS-anslutningar.
Api-referensen wolfSSL ger grundlig dokumentation av wolfSSL API, tillsammans med många exempel. Azure Sphere har stöd för en delmängd av API:et som säkerställer binär kompatibilitet.
Krav för program som använder wolfSSL-biblioteket
Program som använder wolfSSL-biblioteket måste innehålla de nödvändiga huvudfilerna och konfigurationen av bygget.
Api:t för wolfSSL kräver inte funktioner i programmanifestet. Men om programmet ansluter till en internetslutpunkt måste programmanifestet innehålla information om anslutningen. Mer information om hur du aktiverar anslutningen finns i Ansluta till webbtjänster .
Sidhuvudfiler
Program som använder wolfSSL API måste innehålla ssl.h
rubrikfilen och kan kräva en eller flera ytterligare huvudfiler, beroende på vilka wolfSSL-funktioner som används:
#include <wolfssl/wolfcrypt/ecc.h>
#include <wolfssl/wolfcrypt/error-crypt.h>
#include <wolfssl/wolfcrypt/random.h>
#include <wolfssl/wolfcrypt/types.h>
#include <wolfssl/ssl.h>
Se wolfSSL-dokumentationen för att avgöra vilka huvudfiler som krävs i programmet.
Konfiguration av bygge
Om du vill skapa ett program med api-stöd för wolfSSL TLS redigerar du CMakePresets.json- och CMakeLists.txt-filerna för att ange mål-API-uppsättningen respektive länka wolfSSL-biblioteket.
Ställ in TARGET_API_SET i CMakePresets.json till 6 eller senare.
"AZURE_SPHERE_TARGET_API_SET": "6"
Lägg
wolfssl
till i listan över target_link_libraries i CMakeLists.txt för att länka wolfSSL-biblioteket till projektet:target_link_libraries(${PROJECT_NAME} applibs pthread gcc_s c wolfssl)
Funktioner som stöds
Azure Sphere SDK stöder klientbaserade wolfSSL TLS med ett Microsoft-klientcertifikat eller ett certifikat eller ditt val. Azure Sphere SDK stöder serverbaserade wolfSSL TLS med endast ett certifikat som du väljer. Exempel på scenarier som inte stöds:
Endast wolfSSL-klientbaserade TLS-anslutningar stöds med microsoft-klientcertifikatet. TLS-anslutningar på serversidan kan inte använda det Klientcertifikat som tillhandahålls av Microsoft.
Ett program kan antingen använda det inbyggda stödet för wolfSSL TLS eller använda och länka i en annan implementering av wolfSSL-bibliotek. Men blandad användning av det inbyggda stödet med ett annat wolfSSL-bibliotek stöds inte.
Använda wolfSSL i Azure Sphere
Azure Sphere-program på hög nivå kan använda wolfSSL för att skapa och kommunicera över en TLS-anslutning. Program måste vanligtvis använda en kombination av teknikerna för att skapa och kommunicera över dessa anslutningar.
Observera
För förbättrad säkerhet bör program använda wolfSSL_CTX_set_verify() för att verifiera värden. Mer information finns i wolfSSL-dokumentationen .
Initiera wolfSSL för TLS-klientanslutningar
Om du vill skapa en TLS-anslutning med wolfSSL måste programmet först initiera biblioteket och SSL-kontexten (CTX), som i följande kodavsnitt:
// Configure the wolfSSL library
if (wolfSSL_Init() != WOLFSSL_SUCCESS) {
Log_Debug("Error initializing wolfSSL library.\n");
goto cleanupLabel;
}
// Configure wolfSSL CTX functionality
WOLFSSL_METHOD *wolfSslMethod = wolfTLSv1_3_client_method();
if (wolfSslMethod == NULL) {
Log_Debug("Unable to allocate TLS v1.3 method.\n");
goto cleanupLabel;
}
WOLFSSL_CTX *wolfSslCtx = wolfSSL_CTX_new(wolfSslMethod);
if (wolfSslCtx == NULL) {
Log_Debug("Unable get create SSL context.\n");
goto cleanupLabel;
}
Läsa in certifikatet
När wolfSSL har initierats kan det läsa in ett certifikat för användning med TLS-anslutningen. Du kan ta med certifikatet i programbildpaketet enligt beskrivningen i Lägga till certifikatutfärdarcertifikat i avbildningspaketet.
I följande exempel visas hur en app kan använda Storage_GetAbsolutePathInImagePackage för att hämta sökvägen till ett klientcertifikat som ingår i programbildpaketet och sedan anropa wolfSSL_CTX_load_verify_locations för att läsa in certifikatet till wolfSSL. Observera att appen måste innehålla storage.h
rubrikfilen för att kunna använda Storage_GetAbsolutePathInImagePackage.
#include <applibs/storage.h>
...
// Get the full path to the certificate file used to authenticate the HTTPS server identity.
// The .pem file is the certificate that is used to verify the
// server identity.
certificatePath = Storage_GetAbsolutePathInImagePackage("certs/YourDesiredCert.pem");
if (certificatePath == NULL) {
Log_Debug("The certificate path could not be resolved: errno=%d (%s)\n", errno,
strerror(errno));
goto cleanupLabel;
}
// Load the client certificate into wolfSSL
if (wolfSSL_CTX_load_verify_locations(ctx, certificatePath, NULL) != WOLFSSL_SUCCESS) {
Log_Debug("Error loading certificate.\n");
goto cleanupLabel;
}
Skapa en anslutning på klientsidan
När certifikatet har laddats in kan appen upprätta TLS-anslutningen. Det här steget omfattar att skapa ett SSL-objekt, associera det med en socketbeskrivning och sedan skapa anslutningen, som i det här exemplet:
// Create the SSL object
if ((ssl = wolfSSL_new(ctx)) == NULL) {
Log_Debug("Error creating final SSL object.\n");
goto cleanupLabel;
}
// Attach the socket file descriptor to wolfSSL
if (wolfSSL_set_fd(ssl, sockfd) != WOLFSSL_SUCCESS) {
Log_Debug("Error attaching socket fd to wolfSSL.\n");
goto cleanupLabel;
}
// Call Connect for incoming connections
if (wolfSSL_connect(ssl) != WOLFSSL_SUCCESS) {
Log_Debug("Error establishing TLS connection to host.\n");
goto cleanupLabel;
}
Läsa och skriva data från anslutningen
Om du vill skriva och läsa data från anslutningen kan programmet använda wolfSSL_write respektive wolfSSL_read som visas i följande exempel. I det här exemplet innehåller skrivning till servern en vanlig HTTP/1.1-begäran om att hämta innehållet på sidan. Dokumentationen på HTTP/1.1: Begäran (w3.org) ger en bra översikt över denna struktur. Observera dock att det här dokumentet har ersatts och du hittar mer information om begärandestrukturen i ersättnings-RFC 9110: HTTP Semantics (rfc-editor.org).
sprintf(buffer, "GET / HTTP/1.1\r\nHost: example.com\r\nAccept: */*\r\n\r\n");
ret = wolfSSL_write(ssl, buffer, (int)strlen(buffer));
if (ret != strlen(buffer)) {
Log_Debug("Error writing GET command to server.\n");
goto cleanupLabel;
}
// Read the data back
ret = wolfSSL_read(ssl, buffer, BUFFER_SIZE);
if (ret == -1) {
Log_Debug("Error reading from host.\n");
goto cleanupLabel;
}
Log_Debug("Received %d bytes from host.\n", ret);
Log_Debug("%s\n", buffer);
Initiera wolfSSL för anslutningar på serversidan
Om du vill skapa en TLS-server med wolfSSL måste programmet först initiera biblioteket och SSL-kontexten (CTX), som i följande kodavsnitt:
// Configure wolfSSL CTX functionality
WOLFSSL_METHOD *wolfSslMethod = wolfTLSv1_3_server_method();
if (wolfSslMethod) == NULL) {
Log_Debug("Unable to allocate TLS v1.3 method\n");
goto cleanupLabel;
}
WOLFSSL_CTX *wolfSslCtx = wolfSSL_CTX_new(wolfSslMethod);
if (wolfSslCtx == NULL) {
Log_Debug("Unable to create SSL context.\n");
goto cleanupLabel;
}
Acceptera inkommande anslutningar med wolfSSL TLS-server
Acceptera inkommande anslutningar från en klient till Azure Sphere-servern.
// Call Accept for incoming connections
if (wolfSSL_accept(ssl) != WOLFSSL_SUCCESS) {
Log_Debug("Error establishing TLS connection to host.\n");
goto cleanupLabel;
}
Rensning
När programmet är klart med anslutningen bör det frigöra relaterade resurser.
free(certificatePath);
if (ssl) {
wolfSSL_free(ssl);
}
if (ctx) {
wolfSSL_CTX_free(ctx);
wolfSSL_Cleanup();
}
Prov
Ett exempel på WolfSSL-funktionen på Azure Sphere-plattformen finns i WolfSSL_HighLevelApp.