如何快速安全地将物联网应用连接到 Google Cloud
投稿人:DigiKey 北美编辑
2019-04-24
Google Cloud 之类的企业级云服务为物联网开发人员提供了各种功能服务,从可扩展虚拟机服务到交钥匙型人工智能 (AI) 应用,不一而足。而这些服务的基本要求则是使用特定的安全方法来建立并维护物联网设备与云端之间的安全连接。但是对开发人员而言,实施适当的安全机制可能会导致延迟,从而增加本就交期紧迫的设计项目的复杂性。
Microchip Technology 的 PIC-IoT WG 开发板采用专用安全 IC 构建,为 Google Cloud 连接提供交钥匙型解决方案。该套件使用专用安全 IC,可提供一个综合性平台,用于加速开发能够安全连接到 Google Cloud 服务的物联网设计。本文介绍了安全连接的关键要求,并阐示了开发人员如何在典型的物联网设计中使用 PIC-IoT WG 来满足这些要求。
安全的复杂性
确保物联网设备与远程主机服务器之间安全连接的能力,是全面保护物联网应用和相关网络企业资源的基础。对于这些服务器和其他企业级系统可以提供的功能和性能,以资源有限的微控制器和最小内存构建的物联网设备则完全无法提供。若是希冀简单的物联网设备能传送传感器数据或实时操控致动器,而出于物联网设备本身的性质局限,即使只是实现最基本的安全算法,可能也无法达到处理要求。
安全方法所依赖的基本原则,即突破安全屏障所付出的代价应比屏障保护的资产价值更高昂。对于基于算法的安全方法,这意味着解密加密信息或破坏认证协议在计算方面应该是令人望而却步的。至少,破坏基于算法的安全性应当需要一定水平的计算资源和所需时间,其代价超过受保护数据或通信通道的价值或时效。因此,加密算法试图将有价值的数据掩藏在一系列复杂的计算密集型处理步骤之下,且必须使用密钥才能解开。例如,广泛使用的高级加密标准 (AES) 算法对数据进行多轮循环处理,各轮循环均包含数个步骤,即首先生成密钥,然后再进行字节替换、移位和矩阵计算(图 1)。
图 1:为了使解密难以实现,甚至无法实现,加密算法专门采用一系列复杂操作,比如 AES 算法的这个步骤,将数据与私钥生成的字节相结合。(图片来源:Wikimedia Commons)
对于诸如 AES 一类的对称加密算法,加密信息接收者需使用相同的密钥才能解密数据。相反,非对称算法使用一对密钥,一个私钥和一个公钥,消除了因使用共享密钥可能造成的风险,可代价却是使计算变得更为复杂。采用这种算法时,发送者和接收者在交换公钥的同时,对各自持有的私钥保密。因此,其中一方可以使用另一方的公钥来加密信息,但信息只能使用另一方的私钥进行解密。
为了进一步提供保护,高级算法会建立在非对称公钥加密算法之上,仅在特定的信息交换会话期间,才允许安全交换用于加密数据的短期共享私钥。考虑到这些密钥交换的关键性,如椭圆曲线 Diffie-Hellman 算法 (ECDH) 等更高级的算法可将密钥深深掩藏在复杂的椭圆曲线计算之下。诸如传输层安全 (TLS) 之类的认证协议通过使用数字证书,将 Diffie-Hellman 密钥交换之类的机制与正式验证方法相结合;而数字证书可在公钥中嵌入来自认证机构(CA,可证明证书的真实性)的可验证数字签名。
正如简要说明所述,安全方法依赖于各层的加密算法和协议,而最终仍取决于私钥。虽然这些层次能经受住黑客的持续攻击,但如若私钥被发现了,整个安全结构顷刻就会分崩离析。
因此,基于硬件的安全密钥存储是物联网设备安全性的基本要求。此外,这些算法和协议的计算复杂性决定了对专用加密引擎的需求,这些引擎必须能够为资源有限的微控制器分担复杂的计算。
基于硬件的安全
专用安全元件硬件设备,如 Microchip Technology 的 ATECC608A CryptoAuthentication IC,具备保护密钥和提高加密算法执行速度所需的特性。除了这些特性外,ATECC608A 还提供片上 EEPROM,可安全存储多达 16 个密钥、证书和其他数据,以及其他必要的功能,包括符合 NIST SP 800-90A/B/C 标准的随机数发生器。
ATECC608A 不仅是一种安全存储设备,还可以提高多种算法的执行速度,包括用于对称加密的 AES 和非对称加密的 ECDH。此外,该器件还支持更高级别的服务,包括安全引导(请参阅“使用加密芯片为物联网器件设计增加安全引导”)。
除了通过分担这些算法的执行任务所获得的直接性能优势之外,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 开发板也能消除这一障碍。
开发端到端的物联网应用
PIC-IoT 板基于 ATECC608A 和 Microchip Technology 的低成本 PIC24FJ128GA705 16 位微控制器,这款无线物联网设计包含了 Microchip Technology 的 ATWINC1510 Wi-Fi 模块、Vishay Semiconductor 的 TEMT6000X01 环境光传感器和 MCP9808 I2C 温度传感器。此外,开发人员通过添加数百种 MikroElektronika 的 Click 板提供的传感器和致动器,可以轻松扩展硬件基础平台。对于软件开发,Microchip Technology 提供了 MPLAB X IDE 及相关的 MPLAB 代码配置器 (MCC) 快速原型开发工具。
该电路板和相关软件可以为基本端到端物联网应用评估提供交钥匙型平台,而这类应用的运行建立在物联网传感器设备与 Google Cloud 服务的安全连接基础之上。该套件以独特的方法实现了相互身份验证,即使对于资源受限的物联网设备也能进行验证。使用该方法,物联网设备可以使用轻型 TLS 服务来验证 Google 端的连接,并用 JavaScript Object Notation (JSON) Web Token (JWT),向 Google 服务器证明自身身份(请参阅“将 IoT 设备安全连接到云端的更简单的解决方案”)。除了器件驱动程序、板级支持包和中间件服务外,Microchip Technology 还通过 MPLAB 开发套件,并作为适用于 PIC-IoT 板的完整样例物联网应用一部分来演示该方法。
通过样例应用程序,开发人员不仅可以获得使用云应用的经验,还可以获得主要云服务提供商提供的物联网专用服务,将物联网设备连接到云端的经验。例如,物联网设备可通过 Google Cloud IoT Core 访问 Google Cloud 资源,该 IoT Core 提供了设备连接、相关元数据管理等所需的一系列服务(图 3)。
图 3:与其他企业云提供商一样,Google Cloud 也提供专用服务 Google Cloud IoT Core,旨在满足将物联网设备与云资源结合相关的独特要求。(图片来源:Google)
使用云服务
在后端,Google Cloud IoT Core 使用发布/订阅模式,通过数据代理为设备提供对 Google Cloud 高级资源的访问权限。在前端,IoT Core 采用超文本传输协议 (HTTP) 或消息队列遥测传输 (MQTT),为物联网设备起到了桥接作用。MQTT 是国际标准化组织 (ISO) 的标准消息传输协议,旨在以最小通信带宽和物联网设备资源运行。Microchip Technology 的 PIC-IoT 板软件应用演示了如何采用在传输控制协议/网际协议 (TCP/IP) 套接字连接上运行的 MQTT,而该连接采用上述的 TLS/JWT 双向认证方法来确保安全。
建立安全连接后,该软件采用 MQTT 与 Google Cloud IoT Core 服务进行通信,建立通道或“主题”,用于将传感器数据发送到 Google Cloud 并响应来自云服务的命令。Google 调用物联网设备软件进行订阅,然后将数据发送到表单 /devices/{deviceID}/events
的指定主题,并在宽泛的 events
主题下提供了子主题选项。除了设备管理功能等其他主题外,Google 还指定了 /devices/{device-id}/commands
主题,可用于将命令从云端发送到物联网设备。Google 甚至提供了一个全能主题 (/devices/{device-id}/commands/#
),允许物联网设备接收通过任何子主题发送的命令。
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)。在本例中,样例应用程序使用 config
主题,并从 NUM_TOPICS_SUBSCRIBE=1
开始将索引硬编码到表中,但使用一般命令主题和派生子主题也是另一种选择。
复制 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 代码配置器来修改或构建安全连接到 Google Cloud 的全新物联网应用。
总结
在物联网设备与网络资源之间提供安全连接,对于任何网络服务环境都是极其重要的,对于使用商业云服务而言更是必不可少。构建安全连接所需的软件服务层可能会致使物联网项目严重延迟,对于资源有限的物联网设计,甚至难以实现。使用如 Microchip Technology 的 PIC-IoT 等开发板(包含专用安全 IC),开发人员可以快速开发出能够安全连接到 Google Cloud 的物联网应用。
免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。