【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

AWS IoT 物联网系列, 第一篇:利用 Lambda 实现 IoT 设备证书的即时注册 (Just-In-Time Registration)

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

    阅读完需:约 37 分钟

AWS IoT 物联网系列, 第一篇:利用 Lambda 实现 IoT 设备证书的即时注册 (Just-In-Time Registration)

AWS IoT 物联网系列博客

当前物联网环境中,设备类型多种多样,连接方式不一而足。为了帮助读者更好的理解并运用 AWS IoT 相关服务,我们提供了一个完整的 IoT 起步指南,包含设备的注册及上线、设备管理、用户身份及权限管理以及成本控制,通过这一系列的起步指南,也可以快速了解到 AWS IoT 服务如何与 Amazon Alexa 语音助手进行集成。AWS IoT 物联网系列共 8 篇,本篇是该系列的第一篇,其他篇链接请在本文结尾处查看。



背景介绍

为了保证通信的安全性,IoT 设备与 AWS IoT Core 的 MQTT 通信使用基于证书的 TLS 1.2 双向认证体系。所谓的双向认证,即意味着 IoT 设备端需安装 IoT 设备证书,并且,签发该证书所使用的 CA 证书需要被 IoT Core 授信,从而完成 IoT Core 对 IoT 设备端的认证。并且,IoT 设备也会验证 IoT Core 的身份。


为了保证 IoT 设备和 IoT Core 的双向安全对接,对于 IoT 设备端,需要安装两类证书:


  1. IoT 设备证书

  2. IoT 平台的 CA 证书

何时使用设备证书的即时注册

当用户希望使用从第三方机构购买或者自签发的 CA 证书,并将由该 CA 证书签发的设备证书的设备连接到 AWS IoT Core 时,可以利用即时注册功能来实现。如果希望直接利用 AWS IoT CA 证书签发的设备证书对设备进行注册激活,可以参考 Certificate Vending Machine 方案

实现步骤如下:

  1. 创建 CA 证书并在 AWS IoT Core 上注册和激活。

  2. 使用该 CA 证书签发设备证书并安装在 IoT 设备上。

  3. 创建 Lambda 函数实现设备证书在 AWS IoT Core 上的自动注册。

  4. IoT 设备与 AWS IoT Core 的第一次连接。

准备工作

本文中的 IoT 设备会使用一台 Amazon Linux EC2 实例模拟,并使用 MQTT Mosquitto Client 工具来模拟 MQTT 消息交互过程。实际应用中的 IoT 设备需要集成 AWS IoT SDK 以实现和 AWS IoT Core 的交互。此外,接下来的所有操作都是以 AWS 北京区为示例。


Amazon Linux EC2 实例上默认安装了 AWS 命令行工具 AWSCLI,如读者使用其他实例或者自己的电脑,请参考此链接来安装 AWSCLI。

第一步:创建 CA 证书并在 AWS IoT Core 上注册和激活

在真实场景中,用户的设备证书经常是由中间 CA 证书 (Intermediate CA Certificate) 签发而来,而不是由根 CA 签发 (Root CA Certificates)。为了方便起见,本步骤会跳过中间 CA 证书,直接用根证书签发设备证书。并且由于实际购买 CA 证书会让笔者付出 N 个月的薪水,这里我们会使用 OpenSSL 来自签发证书,用户可以根据自己的实际情况选择不同的签发方式。


登陆 EC2 实例并执行如下命令创建私钥和对应的 CA 证书:


Python


$ mkdir cert$ cd cert$ openssl genrsa -out CA_Private.key 2048$ openssl req -x509 -new -nodes -key CA_Private.key -sha256 -days 365 -out CA_Certificate.pem
复制代码


我们需要将这个 CA 证书注册到 AWS IOT Core。 为了安全,AWS IOT Core 提供了相应的审核流程确保你同时持有 CA 证书和对应的私钥。因此,在最终注册 CA 证书之前,我们还需要按照流程生成一份用于验证 CA 证书和私钥持有者身份的中间证书(请注意这份证书并不是上面创建的 CA 证书)。下面这个 AWSCLI 命令会返回一个随机生成的认证码,这个认证码会和你的账户绑定。记录下这个认证码,很快我们就会用到。


Python


$ aws iot get-registration-code
复制代码


再次使用 OpenSSL 生成用于验证身份的私钥和证书请求文件(CSR – Certificate Signing Request):


Python


$ openssl genrsa -out Verification_Private.key 2048$ openssl req -new -key Verification_Private.key -out Verification.csr
复制代码


在创建 CSR 的过程中,你会被提示输入如下一些内容,将前一步记录下的认证码填入到 Common Name 中:



Organization Name (eg, company) []:


Organizational Unit Name (eg, section)


Common Name (e.g. server FQDN or YOUR name) []: XXXXXREGISTRATIONCODEXXXXX



接下来,使用 CA 证书和私钥,以及上面创建的 CSR 来生成一份用于验证身份的中间证书:


Python


$ openssl x509 -req -in Verification.csr -CA CA_Certificate.pem -CAkey CA_Private.key -CAcreateserial -out Verification.crt -days 365 -sha256
复制代码


最后,通过如下命令导入 CA 证书和中间证书,AWS IoT Core 会完成 CA 证书的注册和激活。同时,通过设置 –allow-auto-registration 的方式开启设备连接 IoT Core 时设备证书的自动注册。这个命令的输出会返回对应 CA 证书在 AWS IoT Core 上的 ID (caCertificateId).


Python


$ aws iot register-ca-certificate --ca-certificatefile://CA_Certificate.pem --verification-certificate file://Verification.crt --set-as-active --allow-auto-registration
复制代码

第二步:使用 CA 证书签发设备证书

当我们创建并注册好 CA 证书之后,就可以开始用这个 CA 证书来签发设备证书了,步骤如下。


创建一个设备证书的私钥 Device.key 和对应的证书请求文件 Device_Certificate.csr:


Python


$ openssl genrsa -out Device.key 2048$ openssl req -new -key Device.key -out Device_Certificate.csr
复制代码


使用 CA 证书,CA 证书私钥和证书请求文件签发设备证书 Device_Certificate.crt:


Python


$ openssl x509 -req -in Device_Certificate.csr -CA CA_Certificate.pem -CAkey CA_Private.key -CAcreateserial -out Device_Certificate.crt -days 365 -sha256
复制代码


在创建好设备证书并在设备上安装完成后,你可能要问,那我如何注册并使用设备证书呢?你当然可以通过 AWSCLI 命令行甚至图形界面在 AWS IoT Core 上完成注册,但是面对着千千万万的 IoT 设备,应该没有人想这样手动去做。接下来我们就会介绍利用 Lambda 函数,在设备第一次连接 AWS IoT Core 时,自动完成设备证书的注册过程。

第三步:创建 Lambda 函数和 IoT 规则实现设备证书在 AWS IoT Core 上的激活和权限附加

当 IoT 设备第一次连接 AWS IoT Core 时,如果它集成的设备证书是由已在 Core 上注册的 CA 证书签发而来,那么相应的设备证书会实现自动注册,注册后的默认状态为“PENDING_ACTIVATION”,意味着虽然设备证书已经成功注册,但是还处于等待激活的状态。同时,这个连接动作默认会发一条消息到 AWS IoT Core 的 MQTT Topic “$aws/events/certificates/registered/” 上,这条消息事件会是如下的格式:


Python


{
"certificateId": "<certificateID>",
"caCertificateId": "<caCertificateId>",
"timestamp": "<timestamp>",
"certificateStatus": "PENDING_ACTIVATION",
"awsAccountId": "<awsAccountId>",
"certificateRegistrationTimestamp": "<certificateRegistrationTimestamp>"
}
复制代码


大家都知道 Lambda 函数的执行可以由事件来触发,那么接下来我们会做两件事:


  1. 创建一个 Lambda 函数,接收传入的事件,执行代码逻辑去激活设备证书并附加上一条 Policy 去给予这个设备相应的权限。

  2. 创建一个 IoT 规则,订阅 MQTT Topic “$aws/events/certificates/registered/”,当有消息发到这个 Topic 上时,将消息转发给 Lambda 函数处理(激活证书并附加 Policy)。


首先,我们来创建这个 Lambda 函数:


  1. 登陆到 AWS Console 并进入 Lambda 页面。



2. 点击 “创建函数”后选择“从头开始创作”。


  1. 填入“名称”,运行语言选择 “Node.js 6.10”,角色选择“创建自定义角色”。



4. 在新弹出的窗口中,IAM 角色选择“创建新的 IAM 角色”,填入角色名称,点击“查看策略文档”,点击“编辑”。



5. 点击“编辑”会弹出一个窗口,提示在编辑之前务必读一下相关文档,这里我们直接点击确定按钮。当然如果有时间的话,还是建议先读一下文档。


  1. 用如下的策略替换现有策略,可以看到这里我们为 Lambda 函数添加了更新证书和附加 Policy 的权限,点击“允许”完成角色和策略的配置。


``


Python


{  "Version": "2012-10-17",  "Statement": [    {      "Effect": "Allow",      "Action": [        "logs:CreateLogGroup",        "logs:CreateLogStream",        "logs:PutLogEvents"      ],      "Resource": "arn:aws-cn:logs:*:*:*"    },    {      "Effect": "Allow",      "Action": [        "iot:UpdateCertificate",        "iot:CreatePolicy",        "iot:AttachPrincipalPolicy"      ],      "Resource": "*"    }  ]}
复制代码


[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2018/05/29/1.4.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2018/05/29/1.4.png)


7.点击创建函数进入函数配置界面,替换函数当前的代码为:


Python


/** This node.js Lambda function code creates and attaches an IoT policy to the just-in-time registered certificate. It also activates the certificate. The Lambdafunction is attached as a rule engine action to the registration topic $aws/events/certificates/registered/<caCertificateID>**/
var AWS = require('aws-sdk');
exports.handler = function (event, context, callback) {
// 根据实际部署区域写入,在certificateARN一处也是。 var region = "cn-north-1"; var accountId = event.awsAccountId.toString().trim(); var iot = new AWS.Iot({ 'region': region, apiVersion: '2015-05-28' });
var certificateId = event.certificateId.toString().trim();
//这里你可以替换成你想要的topic名称 var topicName = `JITR/test`; var certificateARN = `arn:aws-cn:iot:${region}:${accountId}:cert/${certificateId}`; var policyName = `Policy_${certificateId}`; //定义Policy并赋予权限,允许IoT设备连接,发布,订阅和接受消息 var policy = { "Version": "2012-10-17", "Statement": [ { "Action": [ "iot:Publish", "iot:Subscribe", "iot:Connect", "iot:Receive" ], "Effect": "Allow", "Resource": [ "*" ] } ] };
/* 创建Policy */ iot.createPolicy({
policyDocument: JSON.stringify(policy), policyName: policyName }, (err, data) => {
//Ignore if the policy already exists if (err && (!err.code || err.code !== 'ResourceAlreadyExistsException')) { console.log(err); callback(err, data); return; } console.log(data); /* 附加Policy到设备证书上 */ iot.attachPrincipalPolicy({
policyName: policyName, principal: certificateARN }, (err, data) => {
//Ignore if the policy is already attached if (err && (!err.code || err.code !== 'ResourceAlreadyExistsException')) { console.log(err); callback(err, data); return; } console.log(data); /* 激活证书 */ iot.updateCertificate({ certificateId: certificateId, newStatus: 'ACTIVE' }, (err, data) => { if (err) { console.log(err, err.stack); callback(err, data); } else { console.log(data); callback(null, "Success, created, attached policy and activated the certificate " + certificateId); } }); }); });}
复制代码


8.点击页面右上角的“保存”来完成 Lambda 函数的创建。



在 Lambda 函数创建完成后,我们继续创建 IoT 规则:


  1. 进入 AWS IoT 界面。

  2. 点击页面左侧的“行动”,然后点击右上角的“创建”。

  3. 在创建规则页面中填入规则的“名称”和“描述”,在“属性”一栏填入一个星号“*”。

  4. 在创建规则页面中的“主题筛选条件”里填入“$aws/events/certificates/registered/”,注意这里面的要替换成之前用 OpenSSL 签发的 CA 证书的 ID,这个 ID 可以通过在 AWS IoT 界面的左侧点击“安全” -> “CA”来获得。


  5. 在设置一个或多个操作中点击“添加操作”, 选择“调用 Lambda 函数,传递消息数据”,然后点击“配置操作”。

  6. 函数名称选择之前创建的 Lambda 函数名称,然后点击“添加操作”。

  7. 点击“创建规则”完成 IoT 规则的配置。


到此为止,Lambda 函数和 IoT 规则创建完成。接下来,我们来尝试连接设备到 AWS IoT Core 上。

第四步:IoT 设备与 AWS IoT Core 的第一次连接

为了模拟一台设备,你可以安装 AWS IoT SDK,通过自己的代码调用 SDK 来实现所有的功能。这里我们为了简化步骤和节约时间,选择直接在之前创建的 EC2 上安装 MQTT Mosquitto Client 工具。


登陆到 EC2 实例并执行如下命令:


Python


$ sudo wget http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-7/home:oojah:mqtt.repo -O /etc/yum.repos.d/mqtt.repo
$ sudo yum install mosquitto mosquitto-clients -y
# 如果上面的命令执行时报依赖缺少的错误,可以加上--skip-broken再执行一遍即可$ sudo yum install mosquitto mosquitto-clients -y --skip-broken
复制代码


进入到之前创建的 cert 目录


Python


$ cd cert
复制代码


合并 CA 证书和设备证书到一个新的证书形成有效的证书链:


Python


$ cat Device_Certificate.crt CA_Certificate.pem > Device_CA_Certificate.crt
复制代码


执行 mosquitto_pub 命令去发布一个消息到对应的 topic 上面,这也是设备与 IoT Core 的第一次连接。如果你回想一下之前的步骤,到目前为止我们的设备证书还只存在于设备上面,并没有在 IoT Core 上注册,那么接下来见证奇迹的时刻就要到啦!


Python


$ mosquitto_pub --cafile root-CA.crt --cert Device_CA_Certificate.crt --key Device.key -h xxxxxxxxxxxxxx.iot.cn-north-1.amazonaws.com.cn -p 8883 -q 1 -t JITR/test -i anyclientID --tls-version tlsv1.2 -m "Hello" -d
复制代码


  • 命令中的- cafile 是 IoT Core 的 CA 证书,用于设备去验证 AWS IoT Core 的身份,这个文件可以通过此链接获得。

  • 命令中的- cert 是合并 CA 证书和设备证书后的证书链。

  • 命令中的- key 是设备的私钥。

  • 命令中的- h 是 AWS IoT Core 的接入点,可以通过在 AWS IoT 界面中左下角点击“设置”获得。

  • 命令中的- t 是你要发布消息到哪一个 topic 上,这里我是发布到 JITR/test,你可以选择自己想要发布的 topic。

  • 命令中的- i 可以按照你希望的名字命名


在第一次执行这个命令后,你会看到如下的报错,那么这是为什么呢?


Client anyclientID sending CONNECTError: The connection was lost.
复制代码


实际上设备在第一次连接 IoT Core 的时候,设备证书还没有注册,所以 TLS 认证会失败。这个连接动作会发布一条注册消息到 “$aws/events/certificates/registered/”上面,接下来 Lambda 函数接收到这个消息后,会完成设备证书的注册,附加 Policy,那么我们再次执行这个命令就可以成功了。


Python


$ mosquitto_pub --cafile root-CA.crt --cert Device_CA_Certificate.crt --key Device.key -h xxxxxxxxxxxxxx.iot.cn-north-1.amazonaws.com.cn -p 8883 -q 1 -t JITR/test -i anyclientID --tls-version tlsv1.2 -m "Hello" -d
复制代码


输出如下:



Client anyclientID sending CONNECTClient anyclientID received CONNACKClient anyclientID sending PUBLISH (d0, q1, r0, m1, 'JITR/test', ... (5 bytes))Client anyclientID received PUBACK (Mid: 1)Client anyclientID sending DISCONNECT
复制代码


这里要注意的是,在实际环境中,用户的代码逻辑里要负责处理这一个过程,也就是说在第一次连接失败后需要自动重连一次或多次来完成证书的注册与设备的激活。


这时进入 AWS IoT 界面,点击左侧的安全后,在证书页面中可以看到我们的设备证书已经注册完成并激活了。

参考链接

Just-in-Time Registration of Device Certificates on AWS IoT


作者介绍:


郭松


AWS 解决方案架构师,负责企业级客户的架构咨询及设计优化,同时致力于 AWS IoT 和存储服务在国内和全球企业客户的应用和推广。加入 AWS 之前在EMC研发中心担任系统工程师,对企业级存储应用的高可用架构,方案及性能调优有深入研究。


### 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-1/


2019-10-23 08:00844

评论

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

聊聊Http服务化改造实践

树上有只程序猿

微服务架构 HTTP Feign

深入MaxCompute -第十二弹 -PIVOT/UNPIVOT

阿里云大数据AI技术

大数据

2024光储充展|太原国际光储充技术装备展会

秋硕展览

展会 光伏展 储能展

Ascend C保姆级教程:我的第一份Ascend C代码

华为云开发者联盟

人工智能 华为云 昇腾 华为云开发者联盟 企业号 8 月 PK 榜

机场数据安全三步走战略|盾见

极盾科技

数据安全

快乐开源活动全面升级!提PR,赢PS5、Switch等缤纷好礼

飞桨PaddlePaddle

人工智能 百度飞桨

Xmind for Mac(思维导图软件) 23.08中文激活版

mac

XMind 思维导图软件 苹果mac Windows软件

跑AI大模型的K8s与普通K8s有什么不同?

华为云开发者联盟

人工智能 云计算 华为云 华为云开发者联盟 企业号 8 月 PK 榜

一座玉带桥,盘古通天下

脑极体

AI

Java单元测试及常用语句 | 京东物流技术团队

京东科技开发者

Mockito 测试 单元测试 企业号 8 月 PK 榜 Java单元测试

云密一体,京东云密码资源池实力守护安全防线

京东科技开发者

云原生 网络安全 密码安全 企业号 8 月 PK 榜

浅析Java - SPI机制 | 京东云技术团队

京东科技开发者

Java 后端 spi 企业号 8 月 PK 榜

人工智能改善生活:不同受众的定制化应用

测吧(北京)科技有限公司

Spring高手之路13——BeanFactoryPostProcessor与BeanDefinitionRegistryPostProcessor解析

砖业洋__

spring springboot BeanFactoryPostProcessor BeanDefinitionRegistry

Elasticsearch ILM Shrink Action源码优化与探讨

腾讯云大数据

ES

一文带你了解跨境数据传输和隐私

镭速

跨境数据传输

软件测试 | 人工智能:优势与挑战

测吧(北京)科技有限公司

测试

软件测试/测试开发丨Python 内置库 正则表达式

测试人

Python 正则表达式 程序员 软件测试 自动化测试

高效构建实时数仓:探秘NineData数据复制技术

NineData

数据库 大数据 实时数仓 数据复制 迁移指南

Kubernetes实现微服务容器化

雾岛听风(锋)

微服务 k8s 容器化

深度解读智能媒体服务的重组和进化

阿里云视频云

云计算 视频云

【稳定性】揭秘团队快速排查问题的三字经,你学会了吗? | 京东物流技术团队

京东科技开发者

团队 线上故障 故障排查 企业号 8 月 PK 榜

PoseiSwap 开启“Poseidon”池,治理体系或将全面开启

威廉META

盘点那些国际知名黑客(上篇)

禅道项目管理

点对点传输技术可实现更大的文件传输

镭速

大文件传输 点对点传输

关于我为什么要用微前端这件事

这我可不懂

架构 前端开发 微前端

揭秘ChatGPT,如何打造自己的自定义指令 | 京东云技术团队

京东科技开发者

自定义指令 大语言模型 chatgpt app 企业号 8 月 PK 榜

开源图形驱动在OpenHarmony上的使用和落地

OpenHarmony开发者

OpenHarmony

KaiwuDB 助力能源企业实现 4 大价值提升

KaiwuDB

KaiwuDB 分布式储能

华为云828营销季火热进行中,3大热门产品助力中小企业云上成长

平平无奇爱好科技

AWS IoT 物联网系列, 第一篇:利用 Lambda 实现 IoT 设备证书的即时注册 (Just-In-Time Registration)_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章