如何快速安全地將 IoT 應用連線至 Google Cloud
資料提供者:DigiKey 北美編輯群
2019-04-24
Google Cloud 等企業級雲端服務可為 IoT 開發人員提供多種能力,涵蓋可擴充式虛擬機服務至立即可用的人工智慧 (AI) 應用等等。這些服務的基本要求是使用特定的安全措施,在 IoT 裝置與雲端之間建立並維持安全連線。但對開發人員來說,實施適當的安全機制對期限緊迫的設計專案而言,可能導致進度延誤並增加複雜度。
Microchip Technology 推出的 PIC-IoT WG 開發板內建專用的安全 IC,可提供立即可用的 Google Cloud 連線解決方案。此套件採用專用的安全 IC,可提供全方位的平台,其設計能加速開發可安全連線到 Google Cloud 服務的 IoT 設計。本文將介紹安全連線的關鍵要求,並說明開發人員如何在典型的 IoT 設計中使用 PIC-IoT WG 來滿足這些要求。
安全複雜性
能否在 IoT 裝置與遠端主機伺服器之間進行安全連線,是全面保護 IoT 應用及相關連網企業資源的關鍵。對於使用資源有限型微控制器及最小記憶體搭建的 IoT 裝置,這些伺服器及其他企業級系統可提供此類裝置所缺乏的能力與效能。即便是實作最基本安全演算法所需的處理要求,這些預期用來及時傳輸感測器資料或操作致動器的簡易型 IoT 裝置,也可能因為自身性質而難以滿足要求。
安全措施仰賴一項基本原則,即滲透安全屏障的代價要高於受屏障保護之資產的價值。若採用演算式安全措施,這意味著解密加密訊息或突破身份驗證協定的運算量會令人望而卻步。至少,突破演算式安全措施應當需要一定程度的運算資源和所需時間,其代價要超過受保護資料或通訊通道本身的價值或適時性。因此,加密演算法會試圖將寶貴的資料隱藏在一連串複雜且涉及安全金鑰和大量運算處理的步驟下。例如,廣泛使用的先進加密標準 (AES) 演算法會對資料處理多個回合,每回合均包含一連串步驟,從安全金鑰開始,然後進行位元組替代、移動及矩陣計算 (圖 1)。
圖 1:加密演算法特地採用一連串複雜操作,如 AES 演算法就採用此步驟,將資料與私密金鑰衍生的位元相結合,藉此讓解密不切實際且在實際上不可行。(圖片來源:Wikimedia Commons)
若採用 AES 等對稱式加密演算法,加密訊息的接收者會使用同一個安全金鑰對資料進行解密。相反地,非對稱式演算法則使用一對金鑰 (即一個公鑰與一個私鑰),即可消除共用金鑰的相關風險,但代價是增加解密的運算複雜度。在這種做法中,發送者與接收者會交換公鑰,但私下保管好自己的私鑰。因此,一方可以使用另一方的公鑰來加密訊息,但訊息只能使用另一方的私鑰來解密。
為了提供進一步防護,以非對稱式公鑰加密法為基礎的先進演算法,僅會在特定的訊息交換工作階段期間,才允許安全交換用來加密資料的短效共用私鑰。由於這類金鑰交換極為重要,橢圓曲線迪菲-赫爾曼金鑰交換 (ECDH) 等更為先進的演算法,會將密鑰隱藏在更深層的複雜橢圓曲線計算之中。而傳輸層安全性 (TLS) 等身份驗證協定則使用數位憑證,將迪菲-赫爾曼金鑰交換等機制與正式的識別方法合併使用;而數位憑證會在公鑰中嵌入由憑證機構 (CA,可證實憑證的真實性) 核發的可驗證數位簽章。
如同此簡短說明所述,安全措施需仰賴多層的加密演算法及協定來運作,但最終則須仰賴私鑰來保證安全性。雖然這些保護層經常會受到駭客攻擊,但一旦私鑰被發現,整個安全結構就會迅速崩潰。
因此,硬體式安全金鑰儲存是實現 IoT 裝置安全的基本要求。另外,這些演算法與協定的運算複雜度會決定是否需要使用專屬加密引擎,以將資源有限型微控制器處理複雜運算的負擔卸下。
硬體式安全功能
專用安全元件硬體裝置,如 Microchip Technology 的 ATECC608A CryptoAuthentication IC,可提供保護密鑰以及加速執行加密演算法所需的功能。除了這些功能外,ATECC608A 還提供晶片上 EEPROM,可安全地儲存最多 16 個金鑰、憑證及其他資料,以及其他必要的能力,包括符合 NIST SP 800-90A/B/C 規範的亂數產生器。
ATECC608A 不僅是安全儲存裝置,還可以加速執行多種演算法,包含用於對稱式加密的 AES,以及用於非對稱式加密的 ECDH。另外,此裝置還支援安全啟動等更高階的服務 (請參閱《使用加密晶片在 IoT 裝置設計中添加安全啟動功能》文章)。
除了將執行這些演算法的負擔卸下而直接獲得的效能優勢外,ATECC608A 還整合加密引擎、安全儲存以及其他功能,從本質上提供另一層安全性:即金鑰能與未受信任的實體保持隔離。這些實體包含:無安全性設計的微控制器、在微控制器上執行的軟體,以及軟體的使用者。此裝置還能生成私鑰,可在製造或經銷設施佈建期間提供進一步安全性。
如此一來,相較於傳統的軟體式安全做法,可降低威脅層面的數量。這種做法可支援深度防禦,這才是有效安全原則的關鍵要素。
ATECC608A 這種全面的功能整合方式,可簡化對硬體介面的要求。此裝置可作為另一個 I2C 週邊裝置運作,甚至能與其他裝置共享微控制器的 I2C 匯流排,例如 Microchip Technology 的 MCP9808 等數位感測器 (圖 2)。
圖 2:由於 Microchip Technology 的 ATECC608A CryptoAuthentication IC (左) 可在晶片上完成全部的安全處理作業,因此能夠提供簡單的 I2C 硬體介面,並搭配使用其他 I2C 裝置,例如 Microchip Technology 的 MCP9808 I2C 數位溫度感測器 (右)。(圖片來源:Microchip Technology)
不過,在軟體層面,ATECC608A 眾多的功能會讓介面變得更複雜。Microchip Technology 的 CryptoAuthLib 函式庫可將這個介面抽象化成一組直覺的函數,並透過 CryptoAuthLib 應用程式開發介面 (API) 加以調用。此函式庫與 Microchip Technology 的 MPLAB X 整合式開發環境 (IDE) 中的相關驅動程式和中介軟體綁定提供。雖然 CryptoAuthLib API 與驅動程式可提供以 ATECC608A 進行客製化設計的基本元素,但是開發人員在實作完整的安全鏈以滿足 Google Cloud 安全連線的要求時,還是會面臨其他難題。Microchip Technology 的 PIC-IoT WG 開發板也可排除此障礙。
開發端對端 IoT 應用
PIC-IoT 板乃是以 ATECC608A 及 Microchip Technology 的 PIC24FJ128GA705 16 位元低成本微控制器為架構,這款無線 IoT 設計內含 Microchip Technology 的 ATWINC1510 Wi-Fi 模組、Vishay Semiconductor 的 TEMT6000X01 環境光感測器,以及 MCP9808 I2C 溫度感測器。另外,開發人員可添加 MikroElektronika Click 板提供的數百款感測器與致動器,即可輕鬆地擴充硬體基礎平台。在軟體開發方面,Microchip Technology 則提供 MPLAB X IDE 及相關的 MPLAB 程式碼配置工具 (MCC) 快速原型開發工具。
此電路板及相關軟體提供立即可用的平台,可針對透過安全連線將 IoT 感測裝置連至 Google Cloud 服務的基本端對端 IoT 應用進行評估。此套件實現一種支援相互身份驗證的獨特方法,甚至可用於資源受限的 IoT 裝置。在此作法中,IoT 裝置可使用輕量型 TLS 服務對 Google 端的連線進行驗證,並使用 JavaScript Object Notation (JSON) Web 令牌 (JWT) 向 Google 伺服器進行自我驗證 (請參閱《讓 IoT 裝置更輕鬆安全連線至雲端的解決方案》文章)。除了裝置驅動程式、板支援套件以及中介軟體服務外,Microchip Technology 更在完整的範例 IoT 應用中提供此展示,可由 MPLAB 開發套件中的 PIC-IoT 板取得。
透過範例應用,開發人員不僅能獲得雲端應用的使用經驗,也可在主流雲端服務供應商提供的 IoT 特定服務上獲得經驗,以將 IoT 裝置連到雲端。例如,IoT 裝置可透過 Google Cloud IoT Core 存取 Google Cloud 資源,而且 IoT Core 提供多種服務,可用來連接這些裝置、管理相關中繼資料,以及進行其他更多功能 (圖 3)。
圖 3:與其他企業級雲端供應商一樣,Google Cloud 也提供專用的服務產品:Google Cloud IoT Core,可針對 IoT 裝置與雲端資源進行整合的獨特需求提供支援。(圖片來源:Google)
使用雲端服務
在後端運作上,Google Cloud IoT Core 使用發佈/訂閱 (pub/sub) 模型,讓裝置透過資料代理程式存取 Google Cloud 的高階資源。在前端運作上,IoT Core 可當作橋樑,以支援使用超文本傳輸協定 (HTTP) 或訊息佇列遙測傳輸 (MQTT) 協定進行的 IoT 裝置連線。MQTT 是國際標準化組織 (ISO) 的標準訊息傳送協定,其設計理念是使用最少的通訊頻寬及 IoT 裝置資源運作。Microchip Technology 針對 PIC-IoT 板提供的軟體應用程式,示範如何使用 MQTT 在傳輸控制協定/網際網路協定 (TCP/IP) 通訊端連線上運作,而此連線則使用上述 TLS/JWT 相互身份驗證法來確保安全性。
建立安全連線後,此軟體使用 MQTT 與 Google Cloud IoT Core 服務進行通訊,以建立通道 (即「主題」),以向 Google Cloud 傳送感測器資料,並回應雲端服務發出的命令。Google 會調用 IoT 裝置軟體進行訂閱,並隨後將資料發送至表單 /devices/{deviceID}/events
的指定主題,並且在廣泛的 events
主題下提供子主題選項。除了其他用於裝置管理功能的主題外,Google 還指定 /devices/{device-id}/commands
主題,以將命令從雲端發送至 IoT 裝置。Google 甚至提供一個涵蓋全部的主題 (/devices/{device-id}/commands/#
),能讓 IoT 裝置接收透過任何子主題傳送的命令。
PIC-IoT 應用程式使用以計時器和回調為基礎的可擴充式軟體架構,示範這些不同的程序。基於這種架構,主模組 (main.c
) 只需要提供主要常式 (main()
),以及用於發送 (sendToCloud()
) 與接收 (receivedFromCloud()
) 訊息的應用層級常式。main()
常式本身只調用一對初始化常式,然後才會進入無限迴圈,並在其中執行計時器排程工具,同時預留出使用者常式的位置 (清單 1)。
複製 void receivedFromCloud(uint8_t *topic, uint8_t *payload) { char *toggleToken = "\"toggle\":"; char *subString; if ((subString = strstr((char*)payload, toggleToken))) { LED_holdYellowOn( subString[strlen(toggleToken)] == '1' ); } debug_printer(SEVERITY_NONE, LEVEL_NORMAL, "topic: %s", topic); debug_printer(SEVERITY_NONE, LEVEL_NORMAL, "payload: %s", payload); } // This will get called every 1 second only while we have a valid Cloud connection void sendToCloud(void) { static char json[70]; // This part runs every CFG_SEND_INTERVAL seconds int rawTemperature = SENSORS_getTempValue(); int light = SENSORS_getLightValue(); int len = sprintf(json, "{\"Light\":%d,\"Temp\":\"%d.%02d\"}", light,rawTemperature/100,abs(rawTemperature)%100); if (len >0) { CLOUD_publishData((uint8_t*)json, len); LED_flashYellow(); } } #include "mcc_generated_files/application_manager.h" /* Main application */ int main(void) { // initialize the device SYSTEM_Initialize(); application_init(); while (1) { // Add your application code runScheduler(); } return 1; }
清單 1:Microchip Technology 的 PIC-IoT 板範例應用程式使用一連串計時器與回調來簡化主迴圈,能讓開發人員輕鬆地加入自己的服務與應用常式。(程式碼來源:Microchip Technology)
在無限迴圈之前調用的 SYSTEM_Initialize()
常式,會將各個硬體元件初始化,包括時脈、類比數位轉換器 (ADC)、中斷等等。application_init()
常式會初始化 CryptoAuthentication 函式庫等軟體系統,並連線至 Wi-Fi 及雲端。application_init()
的最後一個任務會設定 100 ms 的計時器,以執行 MAIN_dataTask()
。當計時器到期且 MAIN_dataTask()
調用後,此常式會檢查雲端連線並每秒調用一次 sendToCloud()
,同時視情況設定該板件的 LED 燈,以指示應用目前的運作狀態 (清單 2)。隨後,開發人員能夠以 Microchip Technology 在 Google Cloud 上提供的免費沙箱帳戶,檢視各個感測器數值。
複製 // This gets called by the scheduler approximately every 100ms uint32_t MAIN_dataTask(void *payload) { static time_t previousTransmissionTime = 0; // Get the current time.This uses the C standard library time functions time_t timeNow = time(NULL); // Example of how to send data when MQTT is connected every 1 second based on the system clock if (CLOUD_isConnected()) { // How many seconds since the last time this loop ran?int32_t delta = difftime(timeNow,previousTransmissionTime); if (delta >= CFG_SEND_INTERVAL) { previousTransmissionTime = timeNow; // Call the data task in main.c sendToCloud(); } } if(shared_networking_params.haveAPConnection) { LED_BLUE_SetLow(); } else { LED_BLUE_SetHigh(); } if(shared_networking_params.haveERROR) { LED_RED_SetLow(); } else { LED_RED_SetHigh(); } if (LED_isBlinkingGreen() == false) { if(CLOUD_isConnected()) { LED_GREEN_SetLow(); } else { LED_GREEN_SetHigh(); } } // This is milliseconds managed by the RTC and the scheduler, this return makes the // timer run another time, returning 0 will make it stop return MAIN_DATATASK_INTERVAL; }
清單 2:Microchip Technology 的 PIC-IoT 範例應用程式使用計時器與回調機制,每秒向雲端傳送一次感測器資料 (CFG_SEND_INTERVAL=1
),並更新該板的 LED 燈來指出目前的運作狀態。(程式碼來源:Microchip Technology)
處理來自雲端的命令也同樣簡單。範例應用程式示範了如何關聯回調常式,例如 receivedFromCloud()
可用於處理接收到的訊息。在初始化階段,先前提到的 application_init()
常式會調用常式 (CLOUD_subscribe()
) 來執行 Google Cloud 訂閱流程。在此流程中,軟體會回調 receivedFromCloud()
來更新表格 (imqtt_publishReceiveCallBackTable
) (清單 3)。在本例中,由於 NUM_TOPICS_SUBSCRIBE=1
,範例應用程式會使用 config
主題並將索引寫死到表格中,但您也可選擇更為通用的命令主題及衍生的子主題。
複製 void CLOUD_subscribe(void) { mqttSubscribePacket cloudSubscribePacket; uint8_t topicCount = 0; // Variable header cloudSubscribePacket.packetIdentifierLSB = 1; cloudSubscribePacket.packetIdentifierMSB = 0; // Payload for(topicCount = 0; topicCount < NUM_TOPICS_SUBSCRIBE; topicCount++) { sprintf(mqttSubscribeTopic, "/devices/%s/config", deviceId); cloudSubscribePacket.subscribePayload[topicCount].topic = (uint8_t *)mqttSubscribeTopic; cloudSubscribePacket.subscribePayload[topicCount].topicLength = strlen(mqttSubscribeTopic); cloudSubscribePacket.subscribePayload[topicCount].requestedQoS = 0; imqtt_publishReceiveCallBackTable[0].topic = mqttSubscribeTopic; imqtt_publishReceiveCallBackTable[0].mqttHandlePublishDataCallBack = receivedFromCloud; MQTT_SetPublishReceptionHandlerTable(imqtt_publishReceiveCallBackTable); } if(MQTT_CreateSubscribePacket(&cloudSubscribePacket) == true) { debug_printInfo("CLOUD: SUBSCRIBE packet created"); sendSubscribe = false; } }
清單 3:Microchip Technology 範例應用程式展示出開發人員能輕鬆地將回調常式與接收的 MQTT 訊息進行關聯。在本例中,就將 receivedFromCloud()
函數指定為回調,以從預設主題接收訊息。(程式碼來源:Microchip Technology)
開發人員可使用隨附的 PIC-IoT 硬體及軟體包,立即開始探索從 Google Cloud 收發資料的各種情境。PIC-IoT 硬體內含 ATECC608A CryptoAuthentication 元件且已經過預先設定,可支援 Google Cloud IoT Core 以及這個使用模型。開發人員可以輕鬆使用 MPLAB X IDE 與 MPLAB Code Configurator 來修改或建立全新的 IoT 應用,以安全地連線到 Google Cloud。
結論
在 IoT 裝置及聯網資源之間提供安全連線,對任何聯網的服務環境來說至關重要,而且也是使用商用雲端服務的先決條件。建立安全連線所需的軟體服務層,可能會嚴重拖延 IoT 專案,對於資源有限的 IoT 設計來說,甚至是不切實際的做法。使用內建專用安全 IC 的開發板,如 Microchip Technology 的 PIC-IoT,開發人員即可快速建立能安全連線到 Google Cloud 的 IoT 應用。

聲明:各作者及/或論壇參與者於本網站所發表之意見、理念和觀點,概不反映 DigiKey 的意見、理念和觀點,亦非 DigiKey 的正式原則。