速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

AWS IoT 物联网系列, 第三篇:Certificate Vending Machine – IoT 设备接入 AWS IoT 平台解决方案

  • 2019-10-23
  • 本文字数:3309 字

    阅读完需:约 11 分钟

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 系统源码请点击这里

参考链接

Class: AWS.Iot


作者介绍:


刘洪曦


AWS 解决方案架构师,负责基于 AWS 的云计算方案架构的咨询和设计,同时致力于帮助海外企业在 AWS 云服务的应用和推广。在加入 AWS 之前曾在思科担任网络顾问工程师,负责亚太区域物联网及安全业务的拓展及架构设计,在物联网,数据安全,网络架构有丰富部署实践经验。

### 谢佰臻
亚马逊 AWS 解决方案架构师,擅长网站架设与网络应用开发,熟悉使用 Node.js、Html5、Mysql 数据库,对于 Serverless 架构有自己的理解和实践经验。


### AWS IoT 物联网系列其他博客目录如下:
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-1/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-2/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-3/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-4/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-5/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-6/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-7/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-8/)
复制代码


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/aws-iot-series-3/


2019-10-23 08:001065

评论

发布
暂无评论
发现更多内容

java springboot自习室选座预约小程序源码

清风

计算机毕业设计

10 月 30 日 北京 LiveVideoStack 阿里云视频云专场限量赠票 100 张

阿里云CloudImagine

阿里云 音视频 高清视频 视频编解码 视频云

关于征集第六届世界智能大会平行论坛活动方案的通知

InfoQ 天津

这篇 python 文章,是过去你错过的 python 细节知识点,滚雪球第4季第15篇

梦想橡皮擦

10月月更

Apache APISIX 社区新里程碑——全球贡献者突破 300 位!

API7.ai 技术团队

开源社区 API网关 Apache APISIX

产业互联网下半场,SaaS平台的机遇与挑战

雯雯写代码

SaaS

基于HarmonyOS分布式技术,这群学生赋予冰箱更智能的体验

科技汇

Python代码阅读(第38篇):根据谓词函数和属性字符串构造判断函数

Felix

Python 编程 Code Programing 阅读代码

【Flutter 专题】28 易忽略的【小而巧】的技术点汇总 (五)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 10月月更

华为云企业级Redis:助力VMALL打造先进特征平台

华为云开发者联盟

华为云 云数据库 GaussDB(for Redis) 华为商城 VMALL

官方线索|2021科大讯飞全球开发者大会

搬砖人

AI 大会 1024我在现场

iOS签名校验那些事儿

百度Geek说

后端

Vue进阶(幺叁捌):vue 路由传参的几种基本方式

No Silver Bullet

Vue 路由 10月月更

Apache APISIX 社区成员助力 openEuler 发布第一个社区创新版

API7.ai 技术团队

开源 openresty openEuler api 网关 Apache APISIX

从Ftrace开始内核探索之旅

金蝶天燕云

Linux内核 Ftrace

第六届世界智能大会主题征集活动入选主题公布

InfoQ 天津

这几种Java异常处理方法,你会吗?

华为云开发者联盟

Java 数组 异常 程序

新书榜第一的《图解产品》,帮助内卷中的产品经理实现跨越式发展!

博文视点Broadview

【万字长文】吃透负载均衡

Java 负载均衡 架构 面试 后端

☕【Java技术指南】「技术盲区」看看线程以及线程池的异常处理机制都有哪些?

洛神灬殇

Java 线上程序问题 线程异常 10月月更

阿里大牛珍藏版:高并发系统设计(全彩版手册)带你从基础走向实战

Java 架构 面试 后端 高并发

技术干货 | jsAPI 方式下的导航栏的动态化修改

蚂蚁集团移动开发平台 mPaaS

容器 大前端 移动开发 mPaaS 动态化

开源许可协议介绍

webrtc developer

云小课丨SA基线检查:给云服务来一次全面“体检”

华为云开发者联盟

态势感知 华为云 基线检查 SA 上云合规

腾讯云,五轮面试,六个小时,灵魂拷问,含泪拿下 60W offer

收到请回复

Java 面试 大厂Offer

Apache APISIX 社区周报 | 2021 9.13-9.30

API7.ai 技术团队

开源社区 api 网关 社区周报 Apache APISIX

怎样才能画出清晰明了的时序图

华为云开发者联盟

接口 模型 UML 系统 时序图

无处不在的Kubernetes ,难用的问题解决了吗?

望宸

容器 云原生 PaaS KubeVela kubenetes

一周信创舆情观察(9.27~10.10)

统小信uos

秀到飞起!Alibaba全新出品JDK源码学习指南(终极版)限时开源

收到请回复

Java jdk 面试

爱奇艺埋点投递治理实践

爱奇艺技术产品团队

数据治理 埋点 pingback

AWS IoT 物联网系列, 第三篇:Certificate Vending Machine – IoT 设备接入 AWS IoT 平台解决方案_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章