Så här ansluter du IoT-tillämpningar till Google Cloud snabbt och säkert
Bidraget med av DigiKeys nordamerikanska redaktörer
2019-04-24
Molntjänster på företagsnivå som Google Cloud erbjuder IoT-utvecklarna ett brett urval av funktioner från skalbara virtuella maskintjänster till nyckelfärdiga tillämpningar inom artificiell intelligens (AI). Ett grundläggande krav för dessa tjänster är användningen av specifika säkerhetsmetoder för att etablera och underhålla säkra anslutningar mellan IoT-enheter och molnet. För utvecklare kan dock implementeringen av lämpliga säkerhetsmekanismer leda till fördröjningar och lägga till komplexitet i designprojekt med snäva tidsgränser.
PIC-IoT WG-utvecklingskortet från Microchip Technology är byggt med dedikerad säkerhetskrets och erbjuder en nyckelfärdig lösning för Google Cloud-anslutning. Med den dedikerade säkerhetskretsen ger satsen en heltäckande plattform som är utformade för att påskynda utvecklingen av IoT-konstruktioner för att kunna ansluta till Google Cloud-tjänster säkert. Den här artikeln beskriver de viktigaste kraven på säkerhetsanslutningar och visar hur utvecklarna kan uppfylla kraven med PIC-IoT WG i en typisk IoT-design.
Säkerhetskomplexitet
Förmågan att säkra anslutningarna mellan IoT-enheter och fjärrvärdservrar är grundläggande för det övergripande skyddet av IoT-tillämpningar och relaterade nätverksbaserade företagslösningar. Dessa servrar och andra system på företagsnivå kan ge funktioner och prestanda som inte finns i IoT-enheter som byggts med resursbegränsade mikrostyrenheter och minimalt minne. För enkla IoT-enheter som förväntas leverera sensordata eller driva manöverdon vid givna tider kan behandlingskraven för att implementera de allra enklaste säkerhetsalgoritmerna vara avskräckande genom sin natur.
Säkerhetsmetoderna bygger på den grundläggande principen att penetrering av en säkerhetsbarriär ska vara mer kostsamt än de tillgångar som barriären är avsedd att skydda. För algoritmbaserade säkerhetsmetoder innebär det att avkryptering av ett krypterat meddelande eller bryta ett autentiseringsprotokoll ska vara beräkningsmässigt avskräckande. Åtminstone ska brott av algoritmbaserad säkerhet kräva en nivå av datorresurser och tidsåtgång som överskrider värdet eller aktualiteten hos den skyddade data- eller kommunikationskanalen. Därför är kryptografiska algoritmer utformade för att dölja värdefulla data under ett antal komplexa, beräkningsintensiva bearbetningssteg som inkluderar en hemlig nyckel. Till exempel utsätter den vanligt förekommande AES-algoritmen (Advanced Encryption Standard ) data för flera bearbetningsomgångar som var och en innehåller en serie steg som börjar med en hemlig nyckel och fortsätter med byteersättningar, växlingar och matrisberäkningar (figur 1).

Figur 1: Med syfte att göra avkryptering praktiskt och i stort sett omöjligt utnyttjar de kryptografiska algoritmerna ett antal komplexa manipulationer som det här steget i AES-algormen som kombinerar data med bitar från en privat nyckel. (Bildkälla: Wikimedia Commons)
Med symmetriska kryptografiska algoritmer som AES använder mottagarna av krypterade meddelanden samma hemliga nyckel för att kryptera data. I kontrast till detta använder asymmetriska algoritmer ett antal nycklar, en privat och en offentlig, vilket eliminerar riskerna som är förknippade med användningen av en delad nyckel till kostnad av mer komplexa beräkningar. I den här metoden utbyter en avsändare och en mottagare offentliga nycklar medan de håller sina egna privata nycklar hemliga. Ena parten kan använda den andra partens offentliga nyckel för att kryptera ett meddelande som endast kan krypteras med den andra personens privata nyckel.
För ytterligare skydd bygger avancerade algoritmer på asymmetriska krypteringsmetoder för offentliga nycklar för att tillåta säkert utbyte av en kortlivad delad privat nyckel som används för att kryptera data endast under en särskild meddelandeutbytessession. På grund av den kritiska naturen hos dessa nyckelutbyten döljer mer avancerade algoritmer som ECDH (elliptic curve Diffie-Hellman) hemligheterna ännu djupare under komplexa elliptiska kurvberäkningar. Autentiseringsprotokoll som TLS (Transport Layer Security) kombinerar mekanismer som Diffie-Hellman-nyckelutbyte med formella identifieringsmetoder, med digitala certifikat som bäddar in en offentlig nyckel med en verifierbar digital signatur från en certifikatutfärdare (CA) som verifierar certifikatets giltighet.
Som den här korta beskrivningen antyder förlitar sig säkerhetsmetoderna på lager av kryptografiska algoritmer och protokoll som i slutänden är beroende av privata nycklar. Trots att dessa lager konstant angrips av kommer hela säkerhetsstrukturen snabbt att bryta samman om de the private privata nycklarna upptäcks.
Därför är maskinvarubaserad lagring av säkerhetsnycklar ett grundläggande krav för IoT-enhetssäkerhet. Dessutom innebär de komplexa beräkningarna för dessa algoritmer och protokoll att det krävs specialiserade krypteringsmotorer som kan utföra komplexa beräkningar från mikrostyrenheter med begränsade resurser.
Maskinvarubaserad säkerhet
Specialiserade säkerhetsmaskinvarukomponenter som Microchip Technologys ATECC608A CryptoAuthentication IC ger de funktioner som krävs för att skydda hemligheter och utföra beräkning av kryptografiska algoritmer snabbare. Bland sina funktioner har ATECC608A en EEPROM på kortet för säker lagring av upp till 16 nycklar, certifikat och övriga data samt andra nödvändiga egenskaper inklusive en NIST SP 800-90A/B/C-kompatibel slumptalsgenerator.
Förutom att den är en säker lagringsenhet kan ATECC608A påskynda körandet av ett antal algoritmer inklusive AES för symmetrisk kryptografi och ECDH för asymmetrisk kryptografi. Enheten har även stöd för tjänster på högre nivå inklusive säker startsekvens (se "Använda ett krypteringschip för att lägga till säker omstart i IoT-enhetsdesigner").
Utöver de direkta prestandafördelarna som uppnås genom att avlasta körandet av dessa algoritmer ger ATECC608A:s integrering av dessa krypteringsmotorer, säker lagring och andra funktioner ett extra lager av säkerhet. Nycklarna hålls isolerade från icke betrodda enheter. Dessa enheter inkluderar mikrostyrenheter som inte är utformade för säkerhet, programvara som körs på mikrostyrenheten samt individer som använder programvaran. Enhetens förmåga att generera privata nycklar ger ytterligare säkerhet under distribueringen i tillverknings- eller distributionsanläggningar.
Resultatet är ett minskat antal hotvektorer jämfört med konventionella programvarubaserade säkerhetsmetoder. Detta stöder det djupgående försvar som utgör hjärtat i effektiva säkerhetspolicyer.
Den här omfattande integreringen av funktionalitet i ATECC608A förenklar maskinvarugränssnittskraven. Enheten fungerar som en annan I2C-kringenhet som inte ens kan dela en mikrostyrenhets I2C-buss med andra enheter, som digitala sensorer som Microchip Technologys MCP9808 (figur 2).

Figur 2: Eftersom Microchip Technologys ATECC608A CryptoAuthentication IC (vänster) utför sin säkerhetsbearbetning helt på kortet kan det tillhandahålla ett enkelt I2C-maskinvarugränssnitt som använd med andra I2C-enheter som Microchip Technologys MCP9808 I2C digitala temperaturgivare (höger). (Bildkälla: Microchip Technology)
På programvarunivån innebär dock ATECC608A:s omfattande funktion ett mer komplext gränssnitt. Microchip Technologys CryptoAuthLib-bibliotek abstraherar det här gränssnittet till en uppsättning intuitiva funktionsanrop som är tillgängliga i CryptoAuthLibs tillämpningsprogrammeringsgränssnitt (API). Det här biblioteket har packats med relaterade drivrutiner och mellanprogram i Microchip Technologys MPLAB X integrerade utvecklingsmiljö (IDE). Trots att CryptoAuthLib API och drivrutinerna utgör grundelementen för anpassade designer med ATECC608A står utvecklarna inför ytterligare utmaningar vid implementeringen av hela säkerhetskedjan som krävs för säker anslutning till Google Cloud. Microchip Technologys PIC-IoT WG utvecklingskort avlägsnar även detta hinder.
Utveckla en slutpunkt till slutpunkt-IoT-tillämpning
Baserat på ATECC608A och Microchip Technologys kostnadseffektiva PIC24FJ128GA705 16-bitars mikrostyrenhet är PIC-IoT-kortet en trådlös IoT-design som innefattar Microchip Technologys ATWINC1510 Wi-Fi-modul, Vishay Semiconductors TEMT6000X01 omgivningsljussensor och temperatursensorn MCP9808 I2C. Dessutom kan utvecklarna enkelt utöka maskinvarubasens plattform genom att lägga till sensorer och manöverdon på hundratals tillgängliga MikroElektronika Click-kort. För programvaruutveckling har Microchip Technology sitt MPLAB X IDE och förknippade MPLAB Code Configurator (MCC) snabbverktyg för prototyputveckling.
Kortet och relaterad programvara ger en nyckelfärdig plattform för utvärdering av en grundläggande slutpunkt till slutpunkt-IoT-tillämpning från IoT-sensorenheten till Google Cloud-tjänster via säkra anslutningar. Satsen implementerar en unik metod som är utformad för att möjliggöra ömsesidig autentisering, även med IoT-enheter med begränsade resurser. I den här metoden kan IoT-enheten använda lätta TLS-tjänster för att autentisera Google-sidan av anslutningen och JavaScript Object Notation (JSON) Web Tokens (JWT) för att autentisera sig för Google-servrarna (se "En enklare lösning för säker anslutning av IoT-enheter till molnet"). Tillsammans med drivrutiner, kortsupportpaket och mellanprogramtjänster presenterar Microchip Technology den här metoden som en del av en fullständig IoT-tillämpning för PIC-IoT-kortet via MPLAB-utvecklingssviten.
Genom att arbeta genom provtillämpningen kan utvecklarna skaffa sig erfarenhet av inte bara molntillämpningar utan även av IoT-specifika tjänster som tillhandahålls av större molntjänstleverantörer för att ansluta IoT-enheter till deras moln. Till exempel får IoT-enheter åtkomst till Google Cloud-resurser via Google Cloud IoT Core, som tillhandahåller ett antal tjänster som krävs för att ansluta dessa enheter, hantera deras relaterade metadata med mera (figur 3).

Figur 3: Som med andra leverantörer av företagsmoln erbjuder Google Cloud ett specialiserat utbud av tjänster, Google Cloud IoT Core, som är utformat för att stötta de unika krav som är kopplade till integrering av IoT-enheter med molnresurser. (Bildkälla: Google)
Användning av molntjänster
I serverdelen tillhandahåller Google Cloud IoT Core enheter med tillgång till Google Cloud-resurser på hög nivå via en datamäklare som använder en modell som bygger på publicering/abonnemang (pub/sub). I klientdelen tillhandahåller IoT Core en brygga som stöder IoT-enhetsanslutning med Hypertext Transfer Protocol (HTTP) eller Message Queuing Telemetry Transport (MQTT). MQTT är en ISO-standard (International Organization for Standardization) för meddelandetransport som är utformad för att köras med minimal kommunikationsbandbredd och IoT-enhetsresurser. Microchip Technologys programvaruapplikation för PIC-IoT-kortet demonstrerar användningen av MQTT som körs på en TCP/IP-anslutning (Transmission Control Protocol/Internet Protocol) som säkras med den ömsesidiga TLS/JWT-autentiseringsmetoden som beskrivs tidigare.
Efter att ha etablerat den säkra anslutningen använder programvaran MQTT för att kommunicera med Google Cloud IoT Core-tjänster för att etablera en kanal eller ett "ämne" som används för att skicka sensordata till Google Cloud och svara på kommandon från molntjänster. Google anropar IoT-enhetsprogramvaran för att abonnera och därefter skicka data till ett angivet ämne med formen /devices/{deviceID}/events med möjlighet till underordnade ämnen under det breda ämnet händelser. Utöver andra ämnen som ämnen för enhetshanteringsfunktioner anger Google ett ämne /devices/{device-id}/commands för att skicka kommandon från molnet till IoT-enheten. Google tillhandahåller även ett globalt ämne (/enheter/{device-id}/kommandon/#) som tillåter IoT-enheter att ta emot kommandon som skickas via valfritt underordnat ämne.
PIC-IoT-tillämpningen demonstrerar dessa olika rutiner med en utbyggbar programvaruarkitektur som baseras på timers och återanrop. På grund av den här arkitekturen behöver huvudmodulen (main.c) endast tillhandahålla huvudrutinen (main()) samt rutiner på tillämpningsnivå för att skicka (sendToCloud()) och ta emot (receivedFromCloud())-meddelanden. Själva main()-rutinen anropar bara ett par initieringsrutiner innan den startar en ändlös slinga som kör timerschemaläggaren och tillhandahåller en platshållare för användarrutiner (lista 1).
Copy 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; }
Lista 1: Microchip Technologys provtillämpning för PIC-IoT-kortet använder ett antal timers och anrop som förenklar huvudslingan och gör det möjligt för utvecklarna att enkelt lägga till egna tjänster och tillämpningsrutiner. (Kodkälla: Microchip Technology)
SYSTEM_Initialize() anropas före den ändlösa slingan och initierar maskinvarukomponenter inklusive klockan, analog-till-digitalomvandlaren (ADC), avbrott och andra. Rutinen application_init() initierar olika programvarusystem inklusive CryptoAuthentication-biblioteket, ansluter till Wi-Fi och till molnet. Som sista uppgift ställer application_init() in en timer på 100 millisekunder (ms) för att köra MAIN_dataTask(). När timern har löpt ut och MAIN_dataTask() anropas kontrollerar den molnanslutningen och anropar sendToCloud() en gång i sekunden och ställer in kortets LED-dioder för att indikera tillämpningens aktuella driftstatus (lista 2). Utvecklarna kan i sin tur visa sensorvärden i ett kostnadsfritt sandlådekonto som tillhandahålls av Microchip Technology på Google Cloud.
Copy // 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; }
Lista 2: Med en timer och anropsmekanism skickar Microchip Technologys PIC-IoT-provtillämpning sensordata till molnet en gång i sekunden (CFG_SEND_INTERVAL=1) och uppdaterar kortets LED-dioder för att visa aktuell driftstatus. (Kodkälla: Microchip Technology)
Att behandla kommandon från molnet är lika enkelt. Provtillämpningen visar hur en anropsrutin som as receivedFromCloud() kopplas till hantering av mottagna meddelanden. Som en del av initieringsfasen kommer rutinen application_init() som nämndes ovan att anropa en rutin (CLOUD_subscribe()) som utför the Google Cloud-abonnemangsprocssen. Som en del av den här processen uppdaterar programvaran en tabell (imqtt_publishReceiveCallBackTable) med återanropet till receivedFromCloud() (lista 3). I det här fallet använder provtillämpningen ämnet config och hårdkodar indexet till tabellen när NUM_TOPICS_SUBSCRIBE=1, men de mer allmänna kommandona ämne och härledda underämnen är ett annat alternativ.
Copy 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; } }
Lista 3: Microchip Technologys provtillämpningar visar hur utvecklare enkelt kan koppla återanropsrutiner till mottagna MQTT-meddelanden, i det här fallet att definiera receivedFromCloud()-funktionen som återanrop för mottagna meddelanden från standardämnet. (Kodkälla: Microchip Technology)
Utvecklare kan använda PIC-IoT-maskinvaru- och -programvarupaket som levereras för att omedelbart utforska olika scenarion för att skicka och ta emot data från Google Cloud. PIC-IoT-maskinvaran inklusive ATECC608A CryptoAuthentication-enheten är förkonfigurerad för att stödja Google Cloud IoT Core och den här användningsmodellen. Utvecklare kan enkelt använda MPLAB X IDE och MPLAB Code Configurator för att modifiera eller bygga en helt ny IoT-tillämpning som är utformad för att anslutas säkert till Google Cloud.
Slutsatser
Att tillhandahålla säkra anslutningar mellan IoT-enheter och nätverksresurser är väsentligt för nätverksanslutna tjänstemiljöer och obligatoriskt för at arbeta med kommersiella molntjänster. Att bygga lagren i programvarutjänster som krävs för säkra anslutningar kan lägga till betydliga fördröjningar i IoT-projekt och kan även vara opraktiskt i resursbegränsade IoT-konstruktioner. Genom att använda utvecklingskort som Microchip Technologys PIC-IoT, som inkluderar en specialiserad säkerhetskrets kan utvecklarna snabbt ta fram en IoT-tillämpning som kan ansluta säkert till Google Cloud.
Disclaimer: The opinions, beliefs, and viewpoints expressed by the various authors and/or forum participants on this website do not necessarily reflect the opinions, beliefs, and viewpoints of DigiKey or official policies of DigiKey.




