

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Buat handler sertifikat khusus untuk penyimpanan aman
<a name="managedintegrations-sdk-v2-cookbook-certhandler"></a>

Manajemen sertifikat perangkat sangat penting saat melakukan onboarding hub integrasi terkelola. Meskipun sertifikat disimpan dalam sistem file secara default, Anda dapat membuat penangan sertifikat khusus untuk keamanan yang ditingkatkan dan manajemen kredensi yang fleksibel.

Integrasi terkelola SDK perangkat akhir menyediakan penangan sertifikat untuk mengamankan antarmuka penyimpanan yang dapat Anda terapkan sebagai pustaka objek bersama (.so). Bangun implementasi penyimpanan aman Anda untuk membaca dan menulis sertifikat, lalu tautkan file pustaka ke HubOnboarding proses saat runtime.

## Definisi dan komponen API
<a name="managedintegrations-sdk-v2-cookbook-certhandler-api"></a>

Tinjau `secure_storage_cert_handler_interface.hpp` file berikut untuk memahami komponen dan persyaratan API untuk implementasi Anda

**Topics**
+ [Definisi API](#managedintegrations-sdk-v2-cookbook-certhandler-apidef)
+ [Komponen kunci](#managedintegrations-sdk-v2-cookbook-certhandler-apicomp)

### Definisi API
<a name="managedintegrations-sdk-v2-cookbook-certhandler-apidef"></a>

**Isi dari `secure_storage_cert_hander_interface.hpp`**

```
/* 
    * Copyright 2024 Amazon.com, Inc. or its affiliates. All rights reserved. 
    *
    * AMAZON PROPRIETARY/CONFIDENTIAL 
    *
    * You may not use this file except in compliance with the terms and
    * conditions set forth in the accompanying LICENSE.txt file.
    *
    * THESE MATERIALS ARE PROVIDED ON AN "AS IS" BASIS. AMAZON SPECIFICALLY 
    * DISCLAIMS, WITH RESPECT TO THESE MATERIALS, ALL WARRANTIES, EXPRESS, 
    * IMPLIED, OR STATUTORY, INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY, 
    * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. 
    */ 
    #ifndef SECURE_STORAGE_CERT_HANDLER_INTERFACE_HPP
    #define SECURE_STORAGE_CERT_HANDLER_INTERFACE_HPP 
    
    #include <iostream>
    #include <memory>
    
    namespace IoTManagedIntegrationsDevice { 
    namespace CertHandler {
    /**
     * @enum CERT_TYPE_T
     * @brief enumeration defining certificate types. 
     */ 
     typedef enum { CLAIM = 0, DHA = 1, PERMANENT = 2 } CERT_TYPE_T;
     class SecureStorageCertHandlerInterface {
      public:
       /** 
        * @brief Read certificate and private key value of a particular certificate
        * type from secure storage.
        */ 
        virtual bool read_cert_and_private_key(const CERT_TYPE_T cert_type, 
                                              std::string &cert_value, 
                                              std::string &private_key_value) = 0; 
        /** 
          * @brief Write permanent certificate and private key value to secure storage.
          */
        virtual bool write_permanent_cert_and_private_key(
            std::string_view cert_value, std::string_view private_key_value) = 0; 
        };
        std::shared_ptr<SecureStorageCertHandlerInterface> createSecureStorageCertHandler();
    } //namespace CertHandler
    } //namespace IoTManagedIntegrationsDevice
  
    #endif //SECURE_STORAGE_CERT_HANDLER_INTERFACE_HPP
```

### Komponen kunci
<a name="managedintegrations-sdk-v2-cookbook-certhandler-apicomp"></a>
+ CERT\_TYPE\_T - berbagai jenis sertifikat di hub.
  + KLAIM - sertifikat klaim yang awalnya ada di hub, akan ditukar dengan sertifikat permanen.
  + DHA - tidak digunakan untuk saat ini.
  + PERMANEN - sertifikat permanen untuk terhubung dengan titik akhir integrasi terkelola.
+ read\_cert\_and\_private\_key - (FUNGSI UNTUK DIIMPLEMENTASIKAN) Membaca sertifikat dan nilai kunci ke input referensi. Fungsi ini harus dapat membaca sertifikat KLAIM dan PERMANEN, dan dibedakan dengan jenis sertifikat yang disebutkan di atas.
+ write\_permanent\_cert\_and\_private\_key - (FUNGSI UNTUK DIIMPLEMENTASIKAN) menulis sertifikat permanen dan nilai kunci ke lokasi yang diinginkan.

## Contoh membangun
<a name="managedintegrations-sdk-v2-cookbook-exbuild"></a>

Pisahkan header implementasi internal Anda dari antarmuka publik (`secure_storage_cert_handler_interface.hpp`) untuk mempertahankan struktur proyek yang bersih. Dengan pemisahan ini, Anda dapat mengelola komponen publik dan pribadi sambil membangun penangan sertifikat Anda.

**catatan**  
Menyatakan `secure_storage_cert_handler_interface.hpp` sebagai publik.

**Topics**
+ [Struktur proyek](#managedintegrations-sdk-v2-cookbook-proj)
+ [Mewarisi antarmuka](#managedintegrations-sdk-v2-cookbook-interface)
+ [Implementasi](#managedintegrations-sdk-v2-cookbook-interimpl)
+ [CMakeList.txt](#managedintegrations-sdk-v2-cookbook-cmakelist)

### Struktur proyek
<a name="managedintegrations-sdk-v2-cookbook-proj"></a>

![Struktur proyek penangan sertifikat integrasi terkelola.](http://docs.aws.amazon.com/id_id/iot-mi/latest/devguide/images/iot-managedintegrations-cert-handler-projstruct.png)


### Mewarisi antarmuka
<a name="managedintegrations-sdk-v2-cookbook-interface"></a>

Buat kelas konkret yang mewarisi antarmuka. Sembunyikan file header ini dan file lainnya di bawah direktori terpisah sehingga header pribadi dan publik dapat dibedakan dengan mudah saat membangun.

```
#ifndef IOTMANAGEDINTEGRATIONSDEVICE_SDK_STUB_SECURE_STORAGE_CERT_HANDLER_HPP
  #define IOTMANAGEDINTEGRATIONSDEVICE_SDK_STUB_SECURE_STORAGE_CERT_HANDLER_HPP 
  
  #include "secure_storage_cert_handler_interface.hpp" 
  
  namespace IoTManagedIntegrationsDevice::CertHandler { 
    class StubSecureStorageCertHandler : public SecureStorageCertHandlerInterface { 
      public:
        StubSecureStorageCertHandler() = default; 
        
        bool read_cert_and_private_key(const CERT_TYPE_T cert_type,
                                      std::string &cert_value, 
                                      std::string &private_key_value) override; 
                                      
        bool write_permanent_cert_and_private_key(
            std::string_view cert_value, std::string_view private_key_value) override; 
            /*
            * any other resource for function you might need 
            */
            
            
          }; 
      } 
    #endif //IOTMANAGEDINTEGRATIONSDEVICE_SDK_STUB_SECURE_STORAGE_CERT_HANDLER_HPP
```

### Implementasi
<a name="managedintegrations-sdk-v2-cookbook-interimpl"></a>

Menerapkan kelas penyimpanan yang didefinisikan di atas,`src/stub_secure_storage_cert_handler.cpp`.

```
/* 
  * Copyright 2024 Amazon.com, Inc. or its affiliates. All rights reserved. 
  * 
  * AMAZON PROPRIETARY/CONFIDENTIAL 
  *
  * You may not use this file except in compliance with the terms and
  * conditions set forth in the accompanying LICENSE.txt file. 
  * 
  * THESE MATERIALS ARE PROVIDED ON AN "AS IS" BASIS. AMAZON SPECIFICALLY 
  * DISCLAIMS, WITH RESPECT TO THESE MATERIALS, ALL WARRANTIES, EXPRESS, 
  * IMPLIED, OR STATUTORY, INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY, 
  * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. 
  */

  #include "stub_secure_storage_cert_handler.hpp" 
  
  using namespace IoTManagedIntegrationsDevice::CertHandler;
  
  bool StubSecureStorageCertHandler::write_permanent_cert_and_private_key( 
              std::string_view cert_value, std::string_view private_key_value) { 
            // TODO: implement write function 
            return true;
  }
  
  bool StubSecureStorageCertHandler::read_cert_and_private_key(const CERT_TYPE_T cert_type, 
                                                          std::string &cert_value,
                                                          std::string &private_key_value) {
          std::cout<<"Using Stub Secure Storage Cert Handler, returning dummy values";
          cert_value = "StubCertVal"; 
          private_key_value = "StubKeyVal"; 
          // TODO: implement read function 
          return true;
  }
```

Menerapkan fungsi pabrik yang didefinisikan dalam antarmuka,`src/secure_storage_cert_handler.cpp`.

```
#include "stub_secure_storage_cert_handler.hpp"
        
        std::shared_ptr<IoTManagedIntegrationsDevice::CertHandler::SecureStorageCertHandlerInterface>
        IoTManagedIntegrationsDevice::CertHandler::createSecureStorageCertHandler() { 
          // TODO: replace with your implementation 
        return std::make_shared<IoTManagedIntegrationsDevice::CertHandler::StubSecureStorageCertHandler>(); 
      }
```

### CMakeList.txt
<a name="managedintegrations-sdk-v2-cookbook-cmakelist"></a>

```
#project name must stay the same
      project(SecureStorageCertHandler) 
      
      # Public Header files. The interface definition must be in top level with exactly the same name 
      #ie. Not in anotherDir/secure_storage_cert_hander_interface.hpp 
      set(PUBLIC_HEADERS
                ${PROJECT_SOURCE_DIR}/include 
      )
      
      # private implementation headers.
      set(PRIVATE_HEADERS 
                ${PROJECT_SOURCE_DIR}/internal/stub 
      )
      
      #set all sources 
      set(SOURCES 
                ${PROJECT_SOURCE_DIR}/src/secure_storage_cert_handler.cpp 
                ${PROJECT_SOURCE_DIR}/src/stub_secure_storage_cert_handler.cpp 
        )
        
      # Create the shared library
      add_library(${PROJECT_NAME} SHARED ${SOURCES})
      target_include_directories( 
                ${PROJECT_NAME} 
                PUBLIC
                    ${PUBLIC_HEADERS} 
                PRIVATE 
                    ${PRIVATE_HEADERS}
      )
      
      # Set the library output location. Location can be customized but version must stay the same
      set_target_properties(${PROJECT_NAME} PROPERTIES 
                LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../lib 
                VERSION 1.0 
                SOVERSION 1
      )
      
      # Install rules
      install(TARGETS ${PROJECT_NAME} 
                LIBRARY DESTINATION lib 
                ARCHIVE DESTINATION lib 
      )
      
      install(FILES ${HEADERS} 
                DESTINATION include/SecureStorageCertHandler
      )
```

## Penggunaan
<a name="managedintegrations-sdk-v2-cookbook-certhandler-usage"></a>

Setelah kompilasi, Anda akan memiliki file pustaka objek `libSecureStorageCertHandler.so` bersama dan tautan simbolik yang terkait. Salin file pustaka dan tautan simbolik ke lokasi perpustakaan yang diharapkan oleh biner. HubOnboarding 

**Topics**
+ [Pertimbangan utama](#managedintegrations-sdk-v2-cookbook-certhandler-useconsider)
+ [Gunakan penyimpanan yang aman](#managedintegrations-sdk-v2-cookbook-certhandler-usagehowto)

### Pertimbangan utama
<a name="managedintegrations-sdk-v2-cookbook-certhandler-useconsider"></a>
+ Verifikasi bahwa akun pengguna Anda telah membaca dan menulis izin untuk HubOnboarding biner dan `libSecureStorageCertHandler.so` pustaka.
+ Simpan `secure_storage_cert_handler_interface.hpp` sebagai satu-satunya file header publik Anda. Semua file header lainnya harus tetap dalam implementasi pribadi Anda.
+ Verifikasi nama pustaka objek bersama Anda. Saat Anda membangun`libSecureStorageCertHandler.so`, HubOnboarding mungkin memerlukan versi tertentu dalam nama file, seperti. `libSecureStorageCertHandler.so.1.0` Gunakan `ldd` perintah untuk memeriksa dependensi perpustakaan dan membuat tautan simbolik sesuai kebutuhan.
+ Jika implementasi pustaka bersama Anda memiliki dependensi eksternal, simpan di direktori yang HubOnboarding dapat diakses, seperti `/usr/lib or the iotmi_common` direktori.

### Gunakan penyimpanan yang aman
<a name="managedintegrations-sdk-v2-cookbook-certhandler-usagehowto"></a>

Perbarui `iotmi_config.json` file Anda dengan mengatur keduanya `iot_claim_cert_path` dan `iot_claim_pk_path` ke**SECURE\_STORAGE**.

```
{
  "ro": { 
    "iot_provisioning_method": "FLEET_PROVISIONING", 
    "iot_claim_cert_path": "SECURE_STORAGE",
    "iot_claim_pk_path": "SECURE_STORAGE", 
    "fp_template_name": "device-integration-example",
    "iot_endpoint_url": "[{{ACCOUNT-PREFIX}}]-ats.iot.{{AWS-REGION}}.amazonaws.com", 
    "SN": "1234567890", 
    "UPC": "1234567890" 
  },
  "rw": { 
    "iot_provisioning_state": "NOT_PROVISIONED"
  }
}
```