背景介绍
为了保障通信的安全性,Amazon IoT 设施与 Amazon IoT 平台的 MQTT 通信应用基于证书的 TLS 1.2 双向认证体系。所谓的双向认证,即意味着 Amazon IoT 设施端需装置 IoT 设施证书,并且,该证书应该由 Amaozn IoT 平台所应用的 CA 证书进行签发,从而实现 Amazon IoT 平台对 Amazon IoT 设施端的认证,反之亦然。
为了保障 Amazon IoT 设施和 Amazon IoT 平台的平安对接,对于 Amazon IoT 设施端,须要装置 2 类证书:
- Amazon IoT 设施证书 Amazon IoT
- 平台 CA 证书
何时该当应用 Certificate Vending Machine?
对于局部曾经出厂的 Amazon IoT 设施,可能在生产过程中没有预装任何证书,然而又心愿这些设施连贯至 Amazon IoT 平台。此时,Certificate Vending Machine (简称 CVM) 能够作为给 Amazon IoT 设施写入相干证书的可行计划,让 Amazon IoT 设施自行向 CVM 服务器申请 Amazon IoT 平台 CA 根证书与 Amazon IoT 设施证书,并且通过 Amazon IoT 治理平台管制设施证书权限,确保物联网通信安全。
通过此文档的设计思维和相干源码,开发者能够疾速开发出合乎本人我的项目需要的 CVM 零碎。然而须要留神,因为默认状况下,原设施没有任何证书进行申请证书阶段的 TLS 认证,所以应用 CVM 的过程中须要留神三点:
- Amazon IoT 设施与 CVM 零碎通信时,原生并没有平安爱护伎俩,所以须要在受信的 DNS 环境下进行,以防中间人攻打。或者采纳其余平安链接的形式,例如应用 HTTPS 与 CVM 服务器交互(须要额定证书)。
- Amazon IoT 设施在利用 CVM 零碎申请证书时,Amazon IoT 设施自身应该具备惟一标识符用于设施的身份标识,例如序列号,client ID 或者 product ID 等,通过该身份标识符进行证书申请及策略绑定。
- 所有通过 CVM 零碎申请获发的 Amazon IoT 设施证书的 CA 根证书,只能够为 Amazon IoT 平台默认应用的 CA 根证书(VeriSign Class 3 Public Primary G5 证书)。如果须要应用自定义的 CA 根证书来进行 Amazon IoT 设施证书的签发,请参考另一篇文档 – JITR 证书注册形式,即,为每个设施在出厂前写入独立的 IoT 设施证书和 CA 根证书。
CVM 实现原理
整个 CVM 实现能够分为三个局部:Amazon IoT 设施端、CVM 零碎和 Amazon IoT 平台
A. Amazon IoT 设施端须要实现的:
- 通过 HTTPS 申请证书。
- 申请时携带设施序列号以及密钥。
B. CVM 零碎须要实现的:
- 向 Amazon IoT 设施提供近程拜访 API 接口。
- CVM 零碎作为代理向 Amazon IoT 平台申请每一个 Amazon IoT 设施的证书。
- 通过校验设施的申请信息与数据库是否统一再决定是否为以后 Amazon IoT 设施申请证书,CVM 应用外部 Node.js 语言实现。
- 应用亚马逊云科技高性能的 NoSQL 数据库 DynamoDB 做为后盾用户数据库。该数据库用来保留 Amazon IoT 设施出厂时注册的设施 ID、密钥和 Amazon IoT 平台 CA 根证书等信息。
- CVM 零碎通过查问 DynamoDB 数据中的关联关系,将 Amazon IoT Thing Name,Certificate Policy 以及 Certificate ID 关联至一起。同时,批改 DynamoDB 里的证书状态标识符,防止同一台设施受到攻打后,反复向 IoT 平台大量申请证书的可能性,从而保障证书与设施的关联唯一性。
CVM 零碎的根本工作流程如下:
CVM 零碎的具体架构如下:
为了使 CVM 服务端更具稳固与扩展性,能够应用 Amazon API Gateway 和 Amazon Lambda 来部署 CVM。通过这种形式,不须要长时间保护和治理部署在 Amazon EC2 上的 CVM,而是通过 Amazon IoT 设施的证书申请的需要,灵便的调配亚马逊云科技上的服务资源。
具体如下:
1) Amazon IoT 设施发送相应 API 申请到 Amazon API Gateway 申请 Amazon IoT 证书
2) Amazon API Gateway 调用申请证书的 Amazon Lambda 向 Amazon IoT 平台发动证书申请
3) Amazon Lambda 接管到申请后,查问 Amazon DynamoDB 校验申请合法性
4) 确认以后申请非法之后,通过 Amazon API 的模式,向 Amazon IoT 平台申请证书
5) Amazon IoT 平台返回新创建的 Amazon IoT 设施证书,以及 Amazon IoT 设施证书对应的 Certificate ID
6) 通过查找 Amazon DynamoDB 中事后创立的对应关系,依据产品序列号,为以后申请到的证书附加对应的 Thing Name(设施属性)以及 Policy(权限)
7) 利用 Amazon Lambda 进行 Amazon IoT 设施证书的策略的绑定以及 Amazon DynamoDB 关联关系表里的证书状态标识符更新
8) 最终 CVM 将 Amazon IoT 平台 CA 根证书和 IoT 设施证书返回给 Amazon IoT 设施
应用 Amazon EC2 代替 Amazon API Gateway 与 Amazon Lambda 的解决方案,其工作流程与搭建 Amazon lambda 的模式基本一致,仅在 Amazon IoT 设施与 CVM 零碎通信时的调用关系上有所区别
1) Amazon IoT 设施向 CVM 服务器申请 Amazon IoT 设施证书
2) Amazon EC2 接管到申请后,拜访 MySQL 校验申请合法性
3) 确认以后申请非法之后,CVM 通过 Amazon API 的模式,向 Amazon IoT 平台发动获取 Amazon IoT 设施证书的申请
4) Amazon IoT 平台返回以后 Amazon IoT 设施对应的证书,以及以后证书的 Certificate ID
5) 通过查找 MySQL 中事后创立的对应关系,依据产品序列号,为以后证书附加对应的 Thing Name(产品属性)以及 Policy(权限)
6) CVM 更新 MySQL 的关联关系表中的以后设施的所有关联信息以及证书状态标识符
7) 最终 CVM 将 Amazon IoT CA 根证书和设施证书返回给 Amazon IoT 设施
目前 Amazon IoT 平台默认所用的根证书(VeriSign Class 3 Public Primary G5)能够到这里下载。
安全性阐明
为了保障 CVM 零碎的安全性,Amazon EC2 或者 Amazon Lambda 函数须要赋予适的 Amazon IAM 角色,使得 CVM 零碎只能进行其授予的工作权限,以下用 Amazon lambda 举例如何为 CVM 零碎调配正确的 Amazon IAM 角色权限。
首先,须要明确 CVM 零碎须要具备以下 Amazon IAM 权限能力实现证书的申请及颁发过程:
√ 拜访 Amazon DynamoDB,用于查问、批改、更新 Amazon DynamoDB 中的设施关联表
√ 拜访 Amazon IoT 平台,用于申请 Amazon IoT 设施证书
除 Amazon IAM 进行权限划分之外,须要在 Amazon DynamoDB 上创立一张关联关系表,用于设施、证书及策略的绑定关系,具体来说,须要在 Amazon DynamoDB 中创立如下数据库字段:
- productid : IoT 设施 ID
- accessToken: IoT 设施 Token
- timestamp : 证书申请工夫戳
- applyState : 申请状态(如果申请过证书设置为 -1,标记此设施曾经注册过证书了)
- certID : 设施关联的证书 ID
外围代码阐明
以下的 CVM server 代码应用了 Amazon Node.js SDK 提供的 Amazon 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
* 左滑查看更多
本篇作者
刘洪曦
亚马逊云科技解决方案架构师
负责基于亚马逊云科技的云计算计划架构的征询和设计,同时致力于帮忙海内企业在亚马逊云科技云服务的利用和推广。在退出亚马逊云科技之前曾在思科负责网络参谋工程师,负责亚太区域物联网及平安业务的拓展及架构设计,在物联网,数据安全,网络架构有丰盛部署实践经验。
谢佰臻
亚马逊云科技解决方案架构师
善于网站架设与网络应用开发,相熟应用 Node.js、Html5、Mysql 数据库,对于 Serverless 架构有本人的了解和实践经验。