1. 程式人生 > >第三篇:Certificate Vending Machine – IoT 裝置接入 AWS IoT 平臺解決方案

第三篇:Certificate Vending Machine – IoT 裝置接入 AWS IoT 平臺解決方案

AWS IoT 物聯網系列部落格

當前物聯網環境中,裝置型別多種多樣,連線方式不一而足。為了幫助讀者更好的理解並運用 AWS IoT 相關服務,我們提供了一個完整的 IoT 起步指南,包含裝置的註冊及上線、裝置管理、使用者身份及許可權管理以及成本控制,通過這一系列的起步指南,也可以快速瞭解到 AWS IoT 服務如何與 Amazon Alexa 語音助手進行整合。AWS IoT 物聯網系列共8篇,本篇是該系列的第一篇,其他篇連結請在本文結尾處檢視。

背景介紹

為了保證通訊的安全性,IoT 裝置與 AWS IoT 平臺的 MQTT 通訊使用基於證書的 TLS 1.2雙向認證體系。所謂的雙向認證,即意味著 IoT 裝置端需安裝 IoT 裝置證書,並且,該證書應該由 IoT 平臺所使用的 CA 證書進行簽發,從而完成 IoT 平臺對 IoT裝置端的認證,反之亦然。

為了保證 IoT 裝置和 IoT 平臺的安全對接,對於 IoT 裝置端,需要安裝2類證書:

  1. IoT 裝置證書
  2. IoT 平臺 CA 證書

何時應當使用 Certificate Vending Machine?

對於部分已經出廠的 IoT 裝置,可能在生產過程中沒有預裝任何證書,但是又希望這些裝置連線至 AWS IoT 平臺。此時,Certificate Vending Machine (簡稱 CVM) 可以作為給 IoT 裝置寫入相關證書的可行方案,讓 IoT 裝置自行向 CVM 伺服器申請 AWS IoT 平臺 CA 根證書與 IoT 裝置證書,並且通過 AWS IoT 管理平臺控制裝置證書許可權,確保物聯網通訊安全。

通過此文件的設計思想和相關原始碼,開發者可以快速開發出符合自己專案需求的 CVM 系統。但是需要注意,由於預設情況下,原裝置沒有任何證書進行申請證書階段的 TLS 認證,所以使用 CVM 的過程中需要注意三點:

  1. IoT 裝置與 CVM 系統通訊時,原生並沒有安全保護手段,所以需要在受信的 DNS 環境下進行,以防中間人攻擊。或者採用其他安全連結的方式,例如使用 HTTPS 與 CVM 伺服器互動(需要額外證書)。
  2. IoT 裝置在利用 CVM 系統申請證書時, IoT 裝置本身應該具備唯一識別符號用於裝置的身份標識,例如序列號,client ID 或者 product ID 等,通過該身份識別符號進行證書申請及策略繫結。
  3. 所有通過 CVM 系統申請獲發的 IoT 裝置證書的 CA 根證書,只可以為 AWS IoT 平臺預設使用的 CA 根證書(VeriSign Class 3 Public Primary G5 證書)。如果需要使用自定義的 CA 根證書來進行 IoT 裝置證書的簽發,請參考另一篇文件 – JITR 證書註冊方式,即,為每個裝置在出廠前寫入獨立的 IoT 裝置證書和 CA 根證書。

CVM 實現原理

整個 CVM 實現可以分為三個部分: IoT 裝置端、CVM 系統和 AWS IoT 平臺

A. IoT 裝置端需要完成的:

  • 通過 HTTPS 請求證書。
  • 請求時攜帶裝置序列號以及金鑰。

B. CVM 系統需要完成的:

  • 向 IoT 裝置提供遠端訪問 API 介面。
  • CVM 系統作為代理向 IoT 平臺申請每一個 IoT 裝置的證書。
  • 通過校驗裝置的請求資訊與資料庫是否一致再決定是否為當前 IoT 裝置申請證書, CVM 使用內部 Node.js 語言實現。
  • 使用 AWS 高效能的 NoSQL 資料庫 DynamoDB 做為後臺使用者資料庫。該資料庫用來儲存 IoT 裝置出廠時註冊的裝置 ID、金鑰和 IoT 平臺 CA 根證書等資訊。
  • CVM 系統通過查詢 DynamoDB 資料中的關聯關係,將 IoT Thing Name,Certificate Policy以及 Certificate ID 關聯至一起。同時,修改 DynamoDB 裡的證書狀態識別符號,避免同一臺裝置遭到攻擊後,重複向 IoT 平臺大量申請證書的可能性,從而保證證書與裝置的關聯唯一性。

CVM 系統的基本工作流程如下:

CVM 系統的具體架構如下:

為了使 CVM 服務端更具穩定與擴充套件性,可以使用 AWS API GatewayLambda 來部署 CVM。通過這種方式,不需要長時間維護和管理部署在 EC2 上的 CVM,而是通過 IoT 裝置的證書申請的需求,靈活的調配 AWS 上的服務資源。

具體如下:

1)  IoT 裝置傳送相應 API 請求到 API Gateway 申請 IoT 證書

2)  AWS API Gateway 呼叫申請證書的 Lambda 向 IoT 平臺發起證書申請

3)  Lambda 接收到請求後, 查詢 DynamoDB 校驗請求合法性

4)  確認當前請求合法之後,通過 API 的形式,向 IoT 平臺申請證書

5)  IoT 平臺返回新建立的 IoT 裝置證書,以及 IoT 裝置證書對應的 Certificate ID

6)  通過查詢 DynamoDB 中預先建立的對應關係,根據產品序列號,為當前申請到的證書附加對應的 Thing Name(裝置屬性)以及 Policy(許可權)

7)  利用 Lambda 進行 IoT 裝置證書的策略的繫結以及 DynamoDB 關聯關係表裡的證書狀態識別符號更新

8)  最終 CVM 將 IoT 平臺 CA 根證書和 IoT 裝置證書返回給 IoT 裝置

使用 EC2 替代 API Gateway 與 Lambda 的解決方案,其工作流程與搭建 lambda 的模式基本一致,僅在 IoT 裝置與 CVM 系統通訊時的呼叫關係上有所區別

1)   IoT 裝置向 CVM 伺服器申請 IoT 裝置證書

2)  EC2 接收到請求後,訪問 MySQL 校驗請求合法性

3)  確認當前請求合法之後,CVM 通過 API 的形式,向 IoT 平臺發起獲取 IoT 裝置證書的請求

4)  IoT 平臺返回當前 IoT 裝置對應的證書,以及當前證書的 Certificate ID

5)  通過查詢 MySQL 中預先建立的對應關係,根據產品序列號,為當前證書附加對應的 Thing Name(產品屬性) 以及 Policy(許可權)

6)  CVM 更新 MySQL 的關聯關係表中的當前裝置的所有關聯資訊以及證書狀態識別符號

7)  最終 CVM 將 IoT CA 根證書和裝置證書返回給 IoT 裝置

目前 AWS IoT 平臺預設所用的根證書(VeriSign Class 3 Public Primary G5)可以到這裡下載

安全性說明

為了保證 CVM 系統的安全性,EC2 或者 Lambda 函式需要賦予合適的 IAM 角色, 使得 CVM 系統只能進行其授予的工作許可權,以下用 lambda 舉例如何為 CVM 系統分配正確的 IAM 角色許可權。

首先,需要明確 CVM 系統需要具備以下 IAM 許可權才能完成證書的申請及頒發過程:

√ 訪問 AWS DynamoDB,用於查詢、修改、更新 DynamoDB 中的裝置關聯表

√ 訪問 IoT 平臺,用於申請 IoT 裝置證書

除 IAM 進行許可權劃分之外,需要在 DynamoDB 上建立一張關聯關係表,用於裝置、證書及策略的繫結關係,具體來說,需要在 DynamoDB 中建立如下資料庫欄位:

  • productid : IoT 裝置 ID
  • accessToken: IoT 裝置 Token
  • timestamp : 證書申請時間戳
  • applyState : 申請狀態(如果申請過證書設定為-1,標記此裝置已經註冊過證書了)
  • certID : 裝置關聯的證書 ID

核心程式碼說明

以下的 CVM server 程式碼使用了 AWS Node.js SDK 提供的 IoT 介面完成證書申請以及附加對應的 Thing Name 和 Policy。

//使用 createKeysAndCertificate 介面建立證書,此介面返回建立後的證書 ID 以及證書

iot.createKeysAndCertificate (params = {}, callback) ⇒ AWS.Request

# 如果需要使用 CSR 進行證書生成,可以使用以下介面

# iot.createCertificateFromCsr(params = {}, callback) ⇒ AWS.Request

 //為證書附加策略,傳入上述介面返回的證書 ID

iot.attachPrincipalPolicy(params = {}, callback) ⇒ AWS.Request

//為證書新增 thing,同樣是傳入上述返回的證書 ID

iot.attachThingPrincipal(params = {}, callback) ⇒ AWS.Request

CVM 系統原始碼請點選這裡

參考連結

本篇作者

相關推薦

Certificate Vending MachineIoT 裝置接入 AWS IoT 平臺解決方案

AWS IoT 物聯網系列部落格 當前物聯網環境中,裝置型別多種多樣,連線方式不一而足。為了幫助讀者更好的理解並運用 AWS IoT 相關服務,我們提供了一個完整的 IoT 起步指南,包含裝置的註冊及上線、裝置管理、使用者身份及許可權管理以及成本控制,通過這一系列的起步指南,

linux設備驅動寫一個簡單的字符設備驅動

提示 copy flags 驅動程序 相關 clas open ugo param 在linux設備驅動第一篇:設備驅動程序簡介中簡單介紹了字符驅動,本篇簡單介紹如何寫一個簡單的字符設備驅動。本篇借鑒LDD中的源碼,實現一個與硬件設備無關的字符設備驅動,僅僅操

Python基礎函數

turn 說明 代碼 名稱 維護 span 大小寫 div 邏輯 一、Python函數介紹 1.函數的作用 規範代碼使代碼變得邏輯性更強 提高可讀性,方便管理,降低維護成本,以及降低代碼冗余 函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。 2.函

爬蟲框架 - Scrapy

工程 講解 爬取 turn 本體 爬蟲框架 sel 傳遞 使用 前言 Python提供了一個比較實用的爬蟲框架 - Scrapy。在這個框架下只要定制好指定的幾個模塊,就能實現一個爬蟲。 本文將講解Scrapy框架的基本體系結構,以及使用這

數據可視化 - ggplot2

strong 保存 轉換成 特征 散點圖 說明 pdf格式 ota 目的 前言 R語言的強大之處在於統計和作圖。其中統計部分的內容很多很強大,因此會在以後的實例中逐步介紹;而作圖部分的套路相對來說是比較固定的,現在可以先對它做一個總體的認識。

開發中的問題及解決方式

.text cat 彈窗 ret 如何 配置 中項 新的 顯示 1.texarea 如何保存空格、換行? 答:var content1= $("#content").val(); var content =content1.replace(/\n|\r\n/g,"&

Shell基本語法

允許 主體 賦值 算數 export $* lar script userdel 目錄 一、什麽是shell script 二、變量 三、運算符 四、流程控制 五、函數   一、什麽是shell script   將OS命令堆積到可執行文件裏,由上至下的順序執行文本裏的

Linux實戰RHEL7.3 yum更換實戰

yum個人筆記分享(在線閱讀):http://note.youdao.com/noteshare?id=cdae09cf51bf77a4e94a2e2865562dbbPDF版本下載http://down.51cto.com/data/2323064本文出自 “人才雞雞” 博客,請務必保留此出處http://

python函數

名稱 bsp 一行 turn 內置 提高 none def 簡單 1、python函數 函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。 函數能提高應用的模塊性,和代碼的重復利用率。你已經知道Python提供了許多內建函數,比如print()。但你也可

Docker容器架構

通信 進程 核心 aca 虛擬化 比較 部署 fff 圖片 Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。 Docker 容器通過 Docker 鏡像來創建。 Docker Daemon是docker最核心的守護進程,

R實戰 數據處理

ase 語言 dex test 矩陣 表達 set mat cond 在實際分析數據之前,必須對數據進行清理和轉化,使數據符合相應的格式,提高數據的質量。數據處理通常包括增加新的變量、處理缺失值、類型轉換、數據排序、數據集的合並和獲取子集等。 一,增加新的變量 通常需要

R實戰 數據處理(基礎)

計算 edi 字符數 定義函數 空間 數值 sqrt 字符類 ceil 數據結構用於存儲數據,不同的數據結構對應不同的操作方法,對應不同的分析目的,應選擇合適的數據結構。在處理數據時,為了便於檢查數據對象,可以通過函數attributes(x)來查看數據對象的屬性,str(

用戶增刪該查及組相關操作

-a home etc -s 信息 -c userdel 家目錄 upm 1.創建用戶及用戶信息例: useradd -u 501 -g 501 -d /home/用戶名 -G 組名 -c 描述語 -s /bin/bash 用戶名 User ID Group

基於深度學習的人臉特徵點檢測 - 資料集整理

https://yinguobing.com/facial-landmark-localization-by-deep-learning-data-collate/ 在上一篇博文中,我們已經下載到了包括300-W、LFPW、HELEN、AFW、IBUG和300-VW在內的6個數據集,初步估算有2

快取資料庫Redis

快取資料庫的介紹請百度 學習資料 本文主要使用Redis製作簡單的使用者賬戶和排行榜 先看一個圖 這裡是Redis不同資料型別 應用的不同場景,再根據我們的要求,我們選擇了 賬戶使用 Hash 來進行儲存,排行榜使用 Sorted Set 進行儲存 賬戶儲存

史上最簡單的SpringCloud教程 | 服務消費者(Feign)

最新Finchley版本請訪問: https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f3-feign/ 或者 http://blog.csdn.net/forezp/article/details/810409

Docker $ Docker 容器的使用

一.Docker容器簡介 1.映象和容器的關係,就像面向物件的程式設計中的類和例項,映象是靜態的,容器是映象執行後產生的,容器1可被建立,啟動,停止,刪除。 2.容器是一個獨立的空間,就下宿主下的作業系統,有自己的檔案系統,網路配置,程序,由於容器的隔離性,在容器下執行的應用比在宿主

在eclipse上部署springcloud小例子--斷路器(Hystrix)

            在微服務架構中,根據業務來拆分成一個個的服務,服務與服務之間可以相互呼叫(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign來呼叫。為了保證其高可用,

資料思維 資料分析的三板斧

令狐沖在華山學藝時,雖然勤學苦練,但是終不得法,在機緣巧合之下,得到風清揚老前輩的真傳,練成獨孤九劍之後,才名震江湖。雖然笑傲江湖的故事情節是虛構的,但從令狐沖蛻變的過程可以看出,練武需要祕籍。資料分析也有一本傳世祕籍,只有六字,這就是《資料化管理》中提到的六字箴言、資料分析的三板斧:對比、細分、溯源,具體來

Spring Boot整合MyBatis

本文主要講解如何在Spring Boot下整合MyBatis並訪問資料庫。MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。(如不瞭解點選前往) 環境依賴 修改 POM 檔案,新增mybatis-spring-boot-starter依賴。值得注