QCon 全球软件开发大会(北京站)门票 9 折倒计时 4 天,点击立减 ¥880 了解详情
写点什么

Certification Vending Machine: 智能设备接入 AWS IoT 平台解决方案

2019 年 11 月 05 日

Certification Vending Machine: 智能设备接入AWS IoT平台解决方案

作者:刘洪曦 谢佰臻


背景介绍

AWS IoT 平台为了保证终端设备通信的安全性,终端设备与 AWS IoT 平台的 MQTT 通信使用基于证书的 TLS 1.2 双向认证体系。即 IoT 平台会验证当前设备使用的证书是否可信,同时,终端设备也会验证 IoT 平台使用的 CA 证书是否可信。



这种双向 TLS 验证模式就会要求设备上所使用的证书需要具备以下条件之一:


  1. IoT 终端设备上所使用的证书为 AWS IoT 平台所签发的

  2. IoT 终端设备上所使用的证书的 CA 证书预先导入了 AWS IoT 平台


所以开发者应该尽量确保每个设备上在出厂前,为每个设备写入独立的证书,并要求该证书为 IoT 平台所信任的证书。这种方式也是最安全高效的。


何时应当使用 Certificate Vending Machine?

对于部分已经生产出厂的 IoT 设备,可能在生产过程中没有预装 IoT 证书,但是又希望这些设备连接至 AWS IoT 平台。此时,Certificate Vending Machine (简称 CVM) 可以作为给终端设备写入 IoT 证书的可行方案,让设备自行向 IoT 平台申请 CA 签发的授信证书,并且通过 AWS IoT 管理平台控制证书权限,确保物联网通信安全。


通过此项目的设计思想和相关源码,开发者可以快速开发出符合自己项目需求的 CVM 系统。但是需要注意,由于原设备没有 IoT 证书进行 TLS 双向认证,所以进行 CVM 的过程中需要注意三点:


  1. IoT 设备与 CVM 系统通信时,原生并没有安全保护手段,所以需要在受信的 DNS 环境下进行,以防中间人攻击。或者采用其他安全链接的方式,例如使用 HTTPS 与 CVM 服务器交互。

  2. IoT 设备在利用 CVM 系统申请证书时,由于不具备用于标识设备的证书,所以 IoT 设备本身应该具备唯一标识符用于设备的身份标识,例如序列号,client ID 或者 product ID 等,通过该身份标识进行证书申请及策略绑定。

  3. 所有通过 CVM 系统申请获发的证书的跟证书,均为 AWS IoT 平台默认使用的 CA 根证书。如果需要使用自定义的 CA 跟证书,请参考 JITR 证书认证方式。


CVM 实现原理

整个项目实现可以分为三个模块: IoT 设备端、CVM 系统和 AWS IoT 平台


A.智能设备端


  • 通过 Https 请求证书

  • 请求时携带设备序列号以及密钥


B. CVM 系统


  • 用于向 IoT 设备提供远程访问接口。

  • CVM 系统作为代理向 IoT 平台申请每一个 IoT 设备的安全证书

  • 校验请求合法性:通过校验请求的信息与数据库是否一致再决定是否为当前 IoT 设备申请证书, CVM 使用内部 Node.js 语言实现

  • 使用了 AWS 高性能的 NoSQL 数据库 DynamoDB 做为后台用户数据库。该数据库用来保存智能设备出厂时注册的设备 ID、密钥和 IoT 平台证书等信息

  • CVM 系统通过查询 DynamoDB 数据中的关联关系,将 IoT Thing Name,Certificate Policy 以及 Certificate ID 关联至一起。同时,修改 DynamoDB 里的证书状态 attribute,避免同一台设备遭到攻击后,重复向 IoT 平台大量申请证书的可能性,从而保证证书与设备的唯一性。


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



CVM 系统的具体架构如下:


为了使 CVM 服务端更具稳定与扩展性,可以使用 AWS API Gateway 和 Lambda 来部署 CVM。通过这种方式,不需要长时间维护和管理部署于 EC2 的 CVM,而是通过 IoT 终端设备的证书申请的需求,灵活的调配 AWS 上的服务资源。



具体如下:


  1. IoT 终端设备升级时请求接入 IoT 平台,发送相应 API 请求到 API Gateway 申请 IoT 证书

  2. AWS API Gateway 调用申请证书的 Lambda 向 IoT 平台发起证书申请

  3. Lambda 接收到请求后, 查询 DynamoDB 校验请求合法性

  4. 确认当前请求合法之后,通过 API 的形式,向 IoT 平台申请证书

  5. IoT 平台返回当前 IoT 终端设备对应的证书,以及当前证书的 certificate ID

  6. 通过查找 DynamoDB 中预先创建的对应关系,根据产品序列号,为当前申请到的证书附加对应的 Thing Name(产品属性) 以及 Policy(权限)

  7. Lambda 进行证书的策略的绑定及 DynamoDB 关联关系表的更新

  8. 最终 CVM 将证书返回给 IoT 终端设备


使用 EC2 替代 API Gateway 与 Lambda 的解决方案,其工作流程与搭建 lambda 的模式基本一致,仅在 IoT 终端设备与 CVM 系统通信时的调用关系上有所区别



  1. IoT 终端设备升级时请求接入 IoT 平台,向 CVM Server 申请 IoT 证书

  2. EC2 接收到请求后,访问 Device DB 校验请求合法性

  3. CVM Server 通过 API 的形式,向 IoT 平台发起获取 IoT 安全证书的请求

  4. IoT 平台返回当前 IoT 终端设备对应的证书,以及当前证书的 certificate ID

  5. 通过查找 DynamoDB 中预先创建的对应关系,根据产品序列号,为当前证书附加对应的 Thing Name(产品属性) 以及 Policy(权限)

  6. 更新当前设备的所有关联信息到 DynamoDB 的关联关系表中

  7. CVM 将证书返回给 IoT 终端设备


安全性说明

为了保证 CVM 系统的安全性,EC2 或者 Lambda 函数需要赋予合适的 IAM 角色, 使得 CVM 系统只能进行其授予的工作权限,以下用 lambda 举例如何为 CVM 系统分配正确的 IAM 角色权限。


首先,需要明确 CVM 系统需要具备一下 IAM 权限才能完整证书的申请及颁发过程:


  • 访问 AWS DynamoDB,用于查询、修改、更新 DynamoDB 中的设备关联表

  • 访问 IoT 平台,用于申请 IoT 终端设备证书




除 IAM 进行权限划分之外,需要在 DynamoDB 上创建一张关联关系表,用于设备与证书及策略的绑定关系,具体来说,需要在 DynamoDB 中创建如下数据库字段:


  • productid : 智能设备 ID

  • accessToken: 智能设备 Token

  • timestamp : 证书申请时间戳

  • applyState : 申请状态(如果申请过证书设置为-1,标记此设备已经注册过证书了)

  • certID : 设备关联的证书 ID


核心代码说明

以下的 CVM server 代码使用了 AWS Node.js SDK 提供的 IOT 接口完成证书申请以及附加对用的 thingName 和 Policy。




复制代码


Java


//使用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 系统服务器端源码(EC2):


https://github.com/cncoder/cvm/tree/master/server


CVM 系统服务器端源码(Lambda):


https://github.com/cncoder/cvm/tree/serverless/server


智能设备端源码:


https://github.com/cncoder/cvm/tree/serverless/device


参考链接

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Iot.html


作者介绍:



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



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


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/certification-vending-machine-intelligent-device-access-aws-iot-platform-solution/


2019 年 11 月 05 日 08:00360

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

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

【译文】创建 Kubernetes manifest 的初学者指南

FeiLong

Kubernetes

Spring Security入门到实践(一)HTTP Basic在Spring Security中的应用原理浅析

itlemon

源码分析 spring security

压测工具如何选择?

elfkingw

GoF设计模式 | 工厂方法模式

Peision

Java 23种设计模式

百万并发「零拷贝」技术系列之初探门径

码农神说

Java 架构 零拷贝

Java的异常处理

Bruce Duan

java异常处理

职业吐槽与反思(一)

石君

职场 吐槽

GoF设计模式 | 单例模式

Peision

Java 后端 23种设计模式

前后端分离跨域问题解决方案

Peision

Java 前后端分离 springboot

创业使人成长系列 (5)-申请国家高新企业

石云升

高新企业

【数据结构】Java 常用集合类 PriorityQueue

Alex🐒

Java 源码 数据结构

JVM 运行时数据区

Alex🐒

JVM 深入理解JVM

vcenter 5.5故障处理

小小文

vcenter

Java并行程序基础

itlemon

Java 高并发 并行

【干货分享】通过命令操作来学习Git

itlemon

git git入门

Flask 中的 Sessions

Leetao

Python flask Web框架

前后端统一结果集封装

Peision

Java json 前后端分离 springboot

玩转混合加密 | 精美配图

阿宝哥

安全 加密解密 数据加密

JVM 垃圾回收器 CMS

Alex🐒

JVM 深入理解JVM GC

解决 Harbor 启动失败故障

FeiLong

Docker Harbor Docker-compose

JVM 垃圾回收机制

Alex🐒

JVM 深入理解JVM

专访英特尔唐炯:对旗下产品性能及未来路线图充满信心

最新动态

C++ 线程安全的单例模式总结

小林coding

c++ 设计模式 单例模式 线程安全

为什么 Flink 无法实时写入 MySQL?

Apache Flink

flink

架构师训练营第七周作业

王铭铭

架构师训练营第七课总结

曾祥斌

记一次bem命名规范使用优化方案

前端有的玩

Vue npm React bem

并发必备基础知识汇总

itlemon

并发 基础

【数据结构】Java 常用集合类 ArrayDeque

Alex🐒

Java 源码 数据结构

架构师训练营 - 命题作业 第 7 周

铁血杰克

Ubuntu 20.04 上安装和配置 VNC

酱紫的小白兔

边缘计算隔离技术的挑战与实践

边缘计算隔离技术的挑战与实践

Certification Vending Machine: 智能设备接入AWS IoT平台解决方案-InfoQ