Share via


TLS bağlantıları için wolfSSL kullanma

Azure Sphere SDK'sı, üst düzey uygulamaların güvenli TLS bağlantıları oluşturmak için kullanabileceği aktarım katmanı güvenliği (TLS) için wolfSSL kitaplığının bir alt kümesini içerir.

wolfSSL API başvurusu, birçok örnekle birlikte wolfSSL API'sinin kapsamlı belgelerini sağlar. Azure Sphere, ikili uyumluluğu sağlayan API'nin bir alt kümesini destekler.

wolfSSL kitaplığını kullanan uygulamalar için gereksinimler

wolfSSL kitaplığını kullanan uygulamalar gerekli üst bilgi dosyalarını ve derleme yapılandırmasını içermelidir.

wolfSSL TLS API'sinin uygulama bildiriminde özellik gerektirmemesi. Ancak, uygulama bir İnternet uç noktasına bağlanıyorsa, uygulama bildirimi bağlantı hakkındaki bilgileri içermelidir. Bağlantıyı etkinleştirme hakkında daha fazla bilgi için bkz. Web hizmetlerine bağlanma .

Üst bilgi dosyaları

wolfSSL API'sini ssl.h kullanan uygulamalar üst bilgi dosyasını içermelidir ve kullanımdaki wolfSSL özelliklerine bağlı olarak bir veya daha fazla ek üst bilgi dosyası gerektirebilir:

#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>

Uygulamanızın hangi üst bilgi dosyalarını gerektirdiğini belirlemek için wolfSSL belgelerine bakın.

Derleme yapılandırması

wolfSSL TLS API desteğiyle bir uygulama oluşturmak için CMakePresets.json ve CMakeLists.txt dosyalarını düzenleyerek hedef API kümesini belirtin ve sırasıyla wolfSSL kitaplığını bağlayın.

  1. CMakePresets.json'daki TARGET_API_SET 6 veya üzeri olarak ayarlayın.

    "AZURE_SPHERE_TARGET_API_SET": "6"
    
  2. wolfSSL kitaplığını projeye bağlamak için CMakeLists.txt'daki target_link_libraries listesine ekleyin wolfssl :

    target_link_libraries(${PROJECT_NAME} applibs pthread gcc_s c wolfssl)
    

Desteklenen özellikler

Azure Sphere SDK'sı, Microsoft tarafından sağlanan bir istemci sertifikasını veya sertifikayı ya da tercihinizi kullanarak istemci tarafı wolfSSL TLS'yi destekler. Azure Sphere SDK'sı, yalnızca seçtiğiniz bir sertifikayı kullanarak sunucu tarafı wolfSSL TLS'yi destekler. Desteklenmeyen önemli senaryolar şunlardır:

  • Microsoft tarafından sağlanan istemci sertifikasıyla yalnızca wolfSSL istemci tarafı TLS bağlantıları desteklenir. Sunucu tarafı TLS bağlantıları Microsoft tarafından sağlanan istemci sertifikasını kullanamaz.

  • Bir uygulama yerleşik wolfSSL TLS desteğini kullanabilir veya başka bir wolfSSL kitaplığı uygulamasında kullanabilir ve bağlayabilir. Ancak, yerleşik desteğin başka bir wolfSSL kitaplığıyla karma kullanımı desteklenmez.

Azure Sphere'de wolfSSL kullanma

Üst düzey Azure Sphere uygulamaları, TLS bağlantısı oluşturmak ve üzerinden iletişim kurmak için wolfSSL kullanabilir. Uygulamalar genellikle bu bağlantılar üzerinden oluşturmak ve iletişim kurmak için tekniklerin bir bileşimini kullanmalıdır.

Not

Gelişmiş güvenlik için uygulamaların konağı doğrulamak için wolfSSL_CTX_set_verify() kullanması gerekir. Daha fazla bilgi için wolfSSL belgelerine bakın.

İstemci TLS bağlantıları için wolfSSL'i başlatma

WolfSSL ile TLS bağlantısı oluşturmak için uygulamanın önce kitaplığı ve SSL bağlamını (CTX) aşağıdaki kod parçacığında olduğu gibi başlatması gerekir:

    // 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;
    }

Sertifikayı yükleme

WolfSSL başlatıldıktan sonra, TLS bağlantısıyla kullanmak üzere bir sertifika yükleyebilir. Sertifikayı, görüntü paketine CA sertifikaları ekleme bölümünde açıklandığı gibi uygulama görüntüsü paketine ekleyebilirsiniz.

Aşağıdaki örnekte bir uygulamanın Storage_GetAbsolutePathInImagePackage kullanarak uygulama görüntüsü paketinin parçası olan bir istemci sertifikasının yolunu nasıl alabildiği ve ardından sertifikayı wolfSSL'ye yüklemek için wolfSSL_CTX_load_verify_locations nasıl çağırabileceği gösterilmektedir. Uygulamanın Storage_GetAbsolutePathInImagePackage kullanmak için üst bilgi dosyasını içermesi storage.h gerektiğini unutmayın.

   #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;
    }

İstemci tarafı bağlantısı oluşturma

Sertifikayı yükledikten sonra uygulama TLS bağlantısını kurabilir. Bu adım bir SSL nesnesi oluşturmayı, bir yuva tanımlayıcısı ile ilişkilendirmeyi ve ardından bağlantıyı oluşturmayı içerir. Bu örnekte olduğu gibi:

    // 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;
    }

Bağlantıdan veri okuma ve yazma

Bağlantıdan veri yazmak ve okumak için uygulama, aşağıdaki örnekte gösterildiği gibi sırasıyla wolfSSL_write ve wolfSSL_read kullanabilir. Bu örnekte sunucuya yazma işlemi, sayfanın içeriğini almak için standart bir HTTP/1.1 isteği içerir. HTTP/1.1: request (w3.org) belgelerinde bu yapıya iyi bir genel bakış sağlanır. Ancak, bu belgenin yerinin alındığını ve istek yapısıyla ilgili diğer ayrıntıları RFC 9110: HTTP Semantiği (rfc-editor.org)'nde bulabilirsiniz.

    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);

Sunucu tarafı bağlantıları için wolfSSL'i başlatma

WolfSSL ile bir TLS sunucusu oluşturmak için, uygulamanın aşağıdaki kod parçacığında olduğu gibi önce kitaplığı ve SSL bağlamını (CTX) başlatması gerekir:

// 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;
    }

wolfSSL TLS sunucusu kullanarak gelen bağlantıları kabul etme

İstemciden Azure Sphere sunucusuna gelen bağlantıları kabul edin.

    // Call Accept for incoming connections
    if (wolfSSL_accept(ssl) != WOLFSSL_SUCCESS) {
        Log_Debug("Error establishing TLS connection to host.\n");
        goto cleanupLabel;
    }

Temizleme

Uygulama bağlantıyı kullanarak tamamlandığında ilgili kaynakları serbest etmelidir.

    free(certificatePath);

    if (ssl) {
        wolfSSL_free(ssl);
    }
    if (ctx) {
        wolfSSL_CTX_free(ctx);
        wolfSSL_Cleanup();
    }

Örnek

Azure Sphere platformundaki WolfSSL işlevselliğinin bir örneği için bkz. WolfSSL_HighLevelApp.