AWS IoT 平台为了保证终端设备通信的安全性,终端设备与 AWS IoT 平台的 MQTT 通信使用基于证书的 TLS 1.2 双向认证体系。即 IoT 平台会验证当前设备使用的证书是否可信,同时,终端设备也会验证 IoT 平台使用的 CA 证书是否可信。
这种双向 TLS 验证模式就会要求设备上所使用的证书需要具备以下条件之一:
所以开发者应该尽量确保每个设备上在出厂前,为每个设备写入独立的证书,并要求该证书为 IoT 平台所信任的证书。这种方式也是最安全高效的。
对于部分已经生产出厂的 IoT 设备,可能在生产过程中没有预装 IoT 证书,但是又希望这些设备连接至 AWS IoT 平台。此时,Certificate Vending Machine (简称 CVM) 可以作为给终端设备写入 IoT 证书的可行方案,让设备自行向 IoT 平台申请 CA 签发的授信证书,并且通过 AWS IoT 管理平台控制证书权限,确保物联网通信安全。
通过此项目的设计思想和相关源码,开发者可以快速开发出符合自己项目需求的 CVM 系统。但是需要注意,由于原设备没有 IoT 证书进行 TLS 双向认证,所以进行 CVM 的过程中需要注意三点:
整个项目实现可以分为三个模块: IoT 设备端、CVM 系统和 AWS IoT 平台
A.智能设备端
B. CVM 系统
CVM 系统的基本工作流程如下:
CVM 系统的具体架构如下:
为了使 CVM 服务端更具稳定与扩展性,可以使用 AWS API Gateway 和 Lambda 来部署 CVM。通过这种方式,不需要长时间维护和管理部署于 EC2 的 CVM,而是通过 IoT 终端设备的证书申请的需求,灵活的调配 AWS 上的服务资源。
具体如下:
使用 EC2 替代 API Gateway 与 Lambda 的解决方案,其工作流程与搭建 lambda 的模式基本一致,仅在 IoT 终端设备与 CVM 系统通信时的调用关系上有所区别
为了保证 CVM 系统的安全性,EC2 或者 Lambda 函数需要赋予合适的 IAM 角色, 使得 CVM 系统只能进行其授予的工作权限,以下用 lambda 举例如何为 CVM 系统分配正确的 IAM 角色权限。
首先,需要明确 CVM 系统需要具备一下 IAM 权限才能完整证书的申请及颁发过程:
除 IAM 进行权限划分之外,需要在 DynamoDB 上创建一张关联关系表,用于设备与证书及策略的绑定关系,具体来说,需要在 DynamoDB 中创建如下数据库字段:
以下的 CVM server 代码使用了 AWS Node.js SDK 提供的 IOT 接口完成证书申请以及附加对用的 thingName 和 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 系统服务器端源码(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
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。