

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 移植 AWS IoT over-the-air(OTA) 更新程式庫
<a name="afr-porting-ota"></a>

透過 FreeRTOS over-the-air(OTA) 更新，您可以執行下列動作：
+ 將新的韌體映像部署到單一裝置、裝置群組，或是您的整個機群。
+ 在將韌體新增至群組、重設或重新佈建時，將韌體部署至裝置。
+ 在新韌體部署到裝置之後，驗證其真實性和完整性。
+ 監控部署進度。
+ 對失敗的部署進行除錯。
+ 使用 Code Signing for 以數位方式簽署韌體 AWS IoT。

如需詳細資訊，請參閱 [FreeRTOS Over-the-Air更新](https://docs.aws.amazon.com/freertos/latest/userguide/freertos-ota-dev.html)以及[AWS IoT Over-the-air更新文件](https://freertos.org/Documentation/api-ref/ota-for-aws-iot-embedded-sdk/docs/doxygen/output/html/index.html)。 *FreeRTOS * 

您可以使用 OTA 更新程式庫，將 OTA 功能整合到您的 FreeRTOS 應用程式。如需詳細資訊，請參閱[FreeRTOS 使用者指南》中的 FreeRTOS OTA 更新程式庫](https://docs.aws.amazon.com/freertos/latest/userguide/ota-update-library.html)。 *FreeRTOS *

FreeRTOS 裝置必須在其收到的 OTA 韌體映像上強制執行密碼編譯程式碼簽署驗證。我們建議以下演算法：
+ 橢圓曲線數位簽章演算法 (ECDSA)
+ NIST P256 曲線
+ SHA-256 雜湊

## 先決條件
<a name="porting-prereqs-ota"></a>
+ 完成 中的指示[設定您的工作區和專案以進行移植](porting-set-up-project.md)。
+ 建立網路傳輸介面連接埠。

  如需相關資訊，請參閱[移植網路傳輸界面](afr-porting-network-transport-interface.md)。
+ 整合 coreMQTT 程式庫。請參閱 FreeRTOS 使用者指南中的 [ coreMQTT 程式庫](https://docs.aws.amazon.com/freertos/latest/userguide/coremqtt.html)。
+ 建立可支援 OTA 更新的開機載入器。

## 平台移植
<a name="porting-steps-ota"></a>

您必須提供 OTA 可攜式抽象層 (PAL) 的實作，才能將 OTA 程式庫移植到新裝置。PAL APIs 在 [ ota\$1platform\$1interface.h ](https://github.com/aws/ota-for-aws-iot-embedded-sdk/blob/main/source/include/ota_platform_interface.h)檔案中定義，其中必須提供實作特定詳細資訊。


| 函數名稱 | Description | 
| --- | --- | 
| `otaPal_Abort` | 停止 OTA 更新。 | 
| `otaPal_CreateFileForRx` | 建立檔案以存放接收的資料區塊。 | 
| `otaPal_CloseFile` | 關閉指定的檔案。如果您使用實作密碼編譯保護的儲存體，這可能會驗證檔案。 | 
| `otaPal_WriteBlock` | 將資料區塊寫入指定檔案中的指定位移。成功時，函數會傳回寫入的位元組數。否則，函數會傳回負錯誤代碼。區塊大小一律為 2 的功率，並會對齊。如需詳細資訊，請參閱 [OTA 程式庫組態](https://freertos.org/Documentation/api-ref/ota-for-aws-iot-embedded-sdk/docs/doxygen/output/html/ota_config.html)。 | 
| `otaPal_ActivateNewImage` | 啟用或啟動新的韌體映像。對於某些連接埠，如果裝置以程式設計方式同步重設，則不會傳回此函數。 | 
| `otaPal_SetPlatformImageState` | 執行讓平台接受或拒絕最新 OTA 韌體映像 (或套件) 所需的動作。若要實作此函數，請參閱主機板 （平台） 詳細資訊和架構的文件。 | 
| `otaPal_GetPlatformImageState` | 取得 OTA 更新映像的狀態。 | 

如果您的裝置內建支援此表格中的函數，請實作這些函數。


| 函數名稱 | Description | 
| --- | --- | 
| `otaPal_CheckFileSignature` | 驗證指定檔案的簽章。 | 
| `otaPal_ReadAndAssumeCertificate` | 從檔案系統讀取指定的簽署者憑證，並傳回給發起人。 | 
| `otaPal_ResetDevice` | 重設裝置。 | 

**注意**  
確定您具有可支援 OTA 更新的開機載入器。如需建立 AWS IoT 裝置開機載入器的說明，請參閱 [IoT 裝置開機載入器](#afr-bootloader)。

## E2E 和 PAL 測試
<a name="porting-steps-testing"></a>

 執行 OTA PAL 和 E2E 測試。

### E2E 測試
<a name="porting-ota-e2e"></a>

OTA 端對端 (E2E) 測試用於驗證裝置的 OTA 功能，以及模擬來自現實的案例。此測試將包含錯誤處理。

#### 先決條件
<a name="e2e-prereqs"></a>

若要移植此測試，您需要下列項目：
+ 整合 OTA AWS 程式庫的專案。如需其他資訊，請參閱[ OTA 程式庫移植指南](https://www.freertos.org/Documentation/api-ref/ota-for-aws-iot-embedded-sdk/docs/doxygen/output/html/ota_porting.html)。
+ 使用 OTA 程式庫移植示範應用程式，與 互動 AWS IoT Core 以進行 OTA 更新。請參閱 [移植 OTA 示範應用程式](#e2e-porting-demo-application)。
+ 設定 IDT 工具。這會執行 OTA E2E 主機應用程式來建置、刷新和監控具有不同組態的裝置，並驗證 OTA 程式庫整合。

#### 移植 OTA 示範應用程式
<a name="e2e-porting-demo-application"></a>

OTA E2E 測試必須具有 OTA 示範應用程式，才能驗證 OTA 程式庫整合。示範應用程式必須具有執行 OTA 韌體更新的容量。您可以在 FreeRTOS [ GitHub 儲存庫找到 FreeRTOS ](https://github.com/FreeRTOS/FreeRTOS/tree/main/FreeRTOS-Plus/Demo/AWS/Ota_Windows_Simulator) OTA 示範應用程式。我們建議您使用示範應用程式做為參考，並根據您的規格進行修改。

##### 移植步驟
<a name="e2e-port-demo"></a>

1. 初始化 OTA 代理程式。

1. 實作 OTA 應用程式回呼函數。

1. 建立 OTA 代理程式事件處理任務。

1. 啟動 OTA 代理程式。

1. 監控 OTA 代理程式統計資料。

1. 關閉 OTA 代理程式。

如需詳細說明[，請造訪示範的 FreeRTOS OTA over MQTT - 進入點](https://www.freertos.org/ota/ota-mqtt-agent-demo.html#OtaMqttAgentEntryPoint)。

##### Configuration
<a name="e2e-port-config"></a>

下列組態是與 互動的必要組態 AWS IoT Core：
+ AWS IoT Core 用戶端登入資料
  + `Ota_Over_Mqtt_Demo/demo_config.h` 使用 Amazon Trust Services 端點在 中設定 **democonfigROOT\$1CA\$1PEM**。如需詳細資訊，請參閱[AWS 伺服器身分驗證](https://docs.aws.amazon.com/iot/latest/developerguide/server-authentication.html)。
  + `Ota_Over_Mqtt_Demo/demo_config.h` 使用 AWS IoT 用戶端憑證在 中設定 **democonfigCLIENT\$1CERTIFICATE\$1PEM** 和 **democonfigCLIENT\$1PRIVATE\$1KEY\$1PEM**。請參閱[AWS 用戶端身分驗證詳細資訊](https://docs.aws.amazon.com/iot/latest/developerguide/client-authentication.html)，以了解用戶端憑證和私有金鑰。
+ 應用程式版本
+ OTA 控制通訊協定
+ OTA 資料通訊協定
+ 程式碼簽署憑證
+ 其他 OTA 程式庫組態

您可以在 FreeRTOS OTA 示範應用程式中`demo_config.h`和 `ota_config.h` 中找到上述資訊。如需詳細資訊[，請參閱透過 MQTT 的 FreeRTOS OTA - 設定裝置](https://www.freertos.org/ota/ota-mqtt-agent-demo.html#OTABasicDemoClient)。

##### 組建驗證
<a name="e2e-port-validation"></a>

執行示範應用程式以執行 OTA 任務。成功完成後，您可以繼續執行 OTA E2E 測試。

FreeRTOS [OTA 示範](https://www.freertos.org/ota/ota-mqtt-agent-demo.html)提供在 FreeRTOS Windows 模擬器上設定 OTA 用戶端和 AWS IoT Core OTA 任務的詳細資訊。 AWS OTA 同時支援 MQTT 和 HTTP 通訊協定。如需詳細資訊，請參閱下列範例：
+ [Windows 模擬器上的透過 MQTT 的 OTA 示範](https://github.com/FreeRTOS/FreeRTOS/tree/main/FreeRTOS-Plus/Demo/AWS/Ota_Windows_Simulator/Ota_Over_Mqtt_Demo)
+ [Windows Simulator 透過 HTTP 的 OTA 示範](https://github.com/FreeRTOS/FreeRTOS/tree/main/FreeRTOS-Plus/Demo/AWS/Ota_Windows_Simulator/Ota_Over_Http_Demo)

#### 使用 IDT 工具執行測試
<a name="e2e-idt"></a>

若要執行 OTA E2E 測試，您必須使用 AWS IoT Device Tester (IDT) 來自動化執行。如需詳細資訊[AWS IoT Device Tester ，請參閱FreeRTOS](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html) *使用者指南》中的 FreeRTOS*。

##### E2E 測試案例
<a name="e2e-test-cases"></a>


| 測試案例 | Description | 
| --- | --- | 
| `OTAE2EGreaterVersion` | 定期 OTA 更新的快樂路徑測試。它使用較新的版本建立更新，裝置會成功更新。 | 
| `OTAE2EBackToBackDownloads` | 此測試會建立連續 3 次的 OTA 更新。裝置預期會連續更新 3 次。 | 
| `OTAE2ERollbackIfUnableToConnectAfterUpdate` | 如果裝置無法使用新韌體連線至網路，此測試會驗證裝置是否復原至先前的韌體。 | 
| `OTAE2ESameVersion` | 如果版本保持不變，此測試會確認裝置拒絕傳入的韌體。 | 
| `OTAE2EUnsignedImage` | 如果影像未簽署，此測試會驗證裝置是否拒絕更新。 | 
| `OTAE2EUntrustedCertificate` | 如果韌體使用不受信任的憑證簽署，此測試會驗證裝置是否拒絕更新。 | 
| `OTAE2EPreviousVersion` | 此測試會驗證裝置是否拒絕較舊的更新版本。 | 
| `OTAE2EIncorrectSigningAlgorithm` | 不同的裝置支援不同的簽署和雜湊演算法。如果使用不支援的演算法建立 OTA 更新，此測試會驗證裝置是否失敗。 | 
| `OTAE2EDisconnectResume` | 這是暫停和繼續功能的快樂路徑測試。此測試會建立 OTA 更新並開始更新。然後，它會 AWS IoT Core 使用相同的用戶端 ID （物件名稱） 和登入資料連線至 。 AWS IoT Core 然後， 會中斷裝置連線。裝置預期會偵測到與 中斷連線 AWS IoT Core，並在一段時間後將自己移至暫停狀態，並嘗試重新連線至 AWS IoT Core 並繼續下載。 | 
| `OTAE2EDisconnectCancelUpdate` | 此測試會檢查裝置是否可在處於暫停狀態時自行復原 OTA 任務是否遭到取消。它會執行與`OTAE2EDisconnectResume`測試相同的動作，除了連線至 後 AWS IoT Core中斷連線的裝置，它會取消 OTA 更新。建立新的更新。裝置預期會重新連線至 AWS IoT Core、中止目前的更新、返回等待狀態，並接受並完成下一次更新。 | 
| `OTAE2EPresignedUrlExpired` | 建立 OTA 更新時，您可以設定 S3 預先簽署 URL 的生命週期。此測試會驗證裝置是否能夠執行 OTA，即使裝置無法在 URL 過期時完成下載。裝置預期會請求新的任務文件，其中包含新的 URL 以繼續下載。 | 
| `OTAE2E2UpdatesCancel1st` | 此測試會連續建立兩個 OTA 更新。當裝置回報正在下載第一次更新時，測試力會取消第一次更新。裝置預期會中止目前的更新，並取得第二個更新，並完成它。 | 
| `OTAE2ECancelThenUpdate` | 此測試會連續建立兩個 OTA 更新。當裝置回報正在下載第一次更新時，測試力會取消第一次更新。裝置預期會中止目前的更新並取得第二個更新，然後完成它。 | 
| `OTAE2EImageCrashed` | 此測試會檢查裝置是否能夠在映像當機時拒絕更新。 | 

### PAL 測試
<a name="porting-ota-pal"></a>

#### 先決條件
<a name="pal-prereqs"></a>

若要移植網路傳輸介面測試，您需要下列項目：
+ 可使用有效的 FreeRTOS 核心連接埠建置 FreeRTOS 的專案。
+ OTA PAL 的工作實作。

#### 移植
<a name="pal-porting"></a>
+ 將 [FreeRTOS-Libraries-Integration-Tests](https://github.com/FreeRTOS/FreeRTOS-Libraries-Integration-Tests) 作為子模組新增至您的專案。專案中子模組的位置必須是可建置的位置。
+ 將 `config_template/test_execution_config_template.h`和 `config_template/test_param_config_template.h` 複製到建置路徑中的位置，並將其重新命名為 `test_execution_config.h`和 `test_param_config.h`。
+ 在建置系統中包含相關檔案。如果使用 `CMake`， `qualification_test.cmake`和 `src/ota_pal_tests.cmake`可用來包含相關檔案。
+ 透過實作下列函數來設定測試：
  + `SetupOtaPalTestParam()`：在 中定義`src/ota/ota_pal_test.h`。實作必須具有與 中定義的相同名稱和簽章`ota_pal_test.h`。目前，您不需要設定此函數。
+ 實作 **UNITY\$1OUTPUT\$1CHAR**，讓測試輸出日誌不會與裝置日誌互斥。
+ `RunQualificationTest()` 從應用程式呼叫 。裝置硬體必須正確初始化，且必須在呼叫之前連接網路。

#### 測試
<a name="ota-testing"></a>

本節說明 OTA PAL 資格測試的本機測試。

##### 啟用測試
<a name="ota-testing-enabling"></a>

開啟 **OTA\$1PAL\$1TEST\$1ENABLED** `test_execution_config.h`並定義為 1。

在 中`test_param_config.h`，更新下列選項：
+ **OTA\$1PAL\$1TEST\$1CERT\$1TYPE**：選取使用的憑證類型。
+ **OTA\$1PAL\$1CERTIFICATE\$1FILE**：裝置憑證的路徑，如適用。
+ **OTA\$1PAL\$1FIRMWARE\$1FILE**：韌體檔案的名稱，如適用。
+ **OTA\$1PAL\$1USE\$1FILE\$1SYSTEM**：如果 OTA PAL 使用檔案系統抽象，請將 設定為 1。

使用您選擇的工具鏈建置和刷新應用程式。`RunQualificationTest()` 呼叫 時，將執行 OTA PAL 測試。測試結果會輸出到序列連接埠。

### 整合 OTA 任務
<a name="integrating-ota"></a>
+ 將 OTA 代理程式新增至您目前的 MQTT 示範。
+ 使用 執行 OTA 端對端 (E2E) 測試 AWS IoT。這會驗證整合是否如預期般運作。

**注意**  
若要正式讓裝置符合 FreeRTOS 的資格，您必須使用 OTA PAL 和 OTA E2E 測試群組來驗證裝置的移植原始碼 AWS IoT Device Tester。請遵循 [ FreeRTOS 使用者指南中的使用 AWS IoT Device Tester for](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html) FreeRTOS 中的指示來設定 AWS IoT Device Tester 連接埠驗證。 *FreeRTOS * 若要測試特定程式庫的連接埠，必須在 資料夾中的 `device.json` 檔案中 AWS IoT Device Tester `configs`啟用正確的測試群組。

## IoT 裝置開機載入器
<a name="afr-bootloader"></a>

您必須提供自己的安全開機載入器應用程式。請確定設計和實作提供安全威脅的適當緩解措施。以下是威脅建模供您參考。

### IoT 裝置開機載入器的威脅模型
<a name="afr-threat-model-for-bootloader"></a>

#### 背景介紹
<a name="afr-threat-model-for-bootloader-background"></a>

作為工作定義，此威脅模型參考的內嵌 AWS IoT 裝置是與雲端服務互動的微型控制器型產品。它們可以部署在消費者、商業或工業環境。IoT 裝置可能會收集有關使用者、病患、機器或環境的資料，並可以控制燈泡和門鎖到工廠機械等任何項目。

威脅模型是假設從對手的角度來檢視安全的方法。透過考慮對手的目標和方法，會建立威脅清單。威脅是對手對資源或資產的攻擊。清單會排定優先順序，並用於識別和建立緩解解決方案。選擇緩解解決方案時，實作和維護它的成本應與它提供的實際安全值平衡。有多種 [威脅模型方法](https://en.wikipedia.org/wiki/Threat_model)。每個 都能夠支援開發安全且成功的 AWS IoT 產品。

FreeRTOS 為 AWS IoT 裝置提供 OTA over-the-air軟體更新。更新設施結合雲端服務與裝置內軟體程式庫和合作夥伴提供的開機載入器。此威脅模型特別著重於對開機載入器的威脅。

**開機載入器使用案例**
+ 在部署前數位簽署及加密韌體。
+ 將新的韌體映像部署到單一裝置、裝置群組，或是整個機群。
+ 在韌體部署到裝置後驗證其真確性及完整性。
+ 裝置只能從信任來源執行未經修改的軟體。
+ 裝置可透過 OTA 接收的故障軟體具備彈性。

**資料流程圖**

![\[內嵌裝置安全性的資料流程圖，其中包含實體存取、內嵌裝置、網際網路邊界和其他元件。\]](http://docs.aws.amazon.com/zh_tw/freertos/latest/portingguide/images/bootloader-dataflow-diagram.png)


#### 威脅
<a name="afr-threat-model-for-bootloader-threats"></a>

有些攻擊有多個緩解模型；例如，透過驗證對 TLS 伺服器所提供憑證的信任，以及新韌體映像的程式碼簽署者憑證，來緩解旨在傳遞惡意韌體映像的網路man-in-the-middle。為了最大限度地提高開機載入器的安全性，任何非開機載入器緩解解決方案都被視為不可靠。開機載入器應具有每次攻擊的內部緩解解決方案。擁有分層緩解解決方案稱為defense-in-depth。

**威脅：**
+ 攻擊者劫持裝置與伺服器的連線，以傳遞惡意韌體映像。

**防護範例**
  + 開機時，開機載入器會使用已知的憑證來驗證映像的加密簽章。如果驗證失敗，開機載入器會回復至前一個映像。
+ 攻擊者利用緩衝區溢位，將惡意行為引入儲存在快閃中的現有韌體映像。

**防護範例**
  + 開機時，開機載入器會進行驗證，如前所述。當驗證失敗且沒有可用的先前映像時，開機載入器會停止。
  + 開機時，開機載入器會進行驗證，如前所述。當驗證失敗且沒有可用的先前映像時，開機載入器會進入故障安全僅限 OTA 模式。
+ 攻擊者可利用裝置開機至先前儲存的映像。

**防護範例**
  + 成功安裝和測試新映像時，會清除儲存最後一個映像的快閃磁區。
  + 每次成功升級時就會燒毀一個保險絲，而每個影像會拒絕執行，除非已燒毀正確的保險絲數量。
+ OTA 會更新提供損壞裝置的故障或惡意映像。

**防護範例**
  + 開機載入器會啟動硬體監視計時器，觸發回復到之前的映像。
+ 攻擊者會修補開機載入器以繞過映像驗證，讓裝置接受未簽署的映像。

**防護範例**
  + 開機載入器位於 ROM (唯讀記憶體) 中，且無法修改。
  + 開機載入器位於 OTP (一次性可程式化記憶體) 中，且無法修改。
  + 開機載入器位於 ARM TrustZone 的安全區域中，且無法修改。
+ 攻擊者會取代驗證憑證，讓裝置能夠接受惡意映像。

**防護範例**
  + 憑證位於密碼編譯共同處理器中，且無法修改。
  + 憑證位於 ROM (或 OTP 或安全區域) 中，且無法修改。

#### 進一步建立威脅模型
<a name="afr-threat-model-for-bootloader-further"></a>

此威脅模型只會考量開機載入器。進一步建立威脅模型可提升整體安全性。建議的方法是列出對手的目標、鎖定的資產目標以及資產的進入點。威脅清單可以透過考慮攻擊的進入點，取得資產的控制權。以下列出 IoT 裝置的目標、資產和進入點的範例。這些清單並不詳盡，旨在刺激進一步思考。

**對手的目標**
+ 侵占金錢 
+ 損害名譽 
+ 偽造資料 
+ 轉移資源 
+ 遠端監視目標 
+ 取得對網站的實體存取 
+ 嚴重破壞
+ 安裝惡意軟體 

**關鍵資產**
+ 私密金鑰 
+ 用戶端憑證 
+ CA 根憑證 
+ 安全登入資料和字符 
+ 客戶的個人識別資訊 
+ 商業秘密的實作 
+ 感應器資料 
+ 雲端分析資料存放區 
+ 雲端基礎設施 

**進入點**
+ DHCP 回應 
+ DNS 回應 
+ 透過 TLS 的 MQTT 
+ HTTPS 回應 
+ OTA 軟體映像 
+ 其他，如應用程式所指定，例如 USB 
+ 匯流排的實體通道 
+ 已宣告的 IC 