aws 接入awsIOT平台的证书签发逻辑

参考资料

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

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

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

  • IoT终端设备上所使用的证书为AWS IoT平台所签发的
  • IoT终端设备上所使用的证书的CA证书预先导入了AWS IoT平台

因此存在两种方式获取设备认证

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

Certification Vending方案

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

生产出厂的IoT设备,可能在生产过程中没有预装IoT证书,又希望这些设备连接至AWS IoT平台

  • 主要目的是让设备自行向IoT平台申请CA签发的授信证书,并且通过AWS IoT管理平台控制证书权限
img

cvs需要客户自行实现

自签证书方案

自签证书JITR

  • https://aws.amazon.com/cn/blogs/china/aws-iot-series-1/

签发ca和私钥

mkdir cert
cd cert
openssl genrsa -out CA_Private.key 2048
openssl req -x509 -new -nodes -key CA_Private.key -sha256 -days 3650 -out CA_Certificate.pem

为了安全AWS IOT Core 提供了相应的审核流程确保你同时持有 CA 证书和对应的私钥,先获取认证码

aws iot get-registration-code
{
    "registrationCode": "c0700df329cedx68def0c7385c83709b4da075"
}

生成另一个私钥和csr,在csr中填入认证码

openssl genrsa -out Verification_Private.key 2048
openssl req -new -key Verification_Private.key -out Verification.csr

# Organization Name (eg, company) []:
# Organizational Unit Name (eg, section)
# Common Name (e.g. server FQDN or YOUR name) []: XXXXXREGISTRATIONCODEXXXXX

使用ca和私钥,生成中间证书(确保ca和私钥的正确性)

openssl x509 -req -in Verification.csr -CA CA_Certificate.pem -CAkey CA_Private.key -CAcreateserial -out Verification.crt -days 3650 -sha256

导入ca和中间证书

aws iot register-ca-certificate --ca-certificate file://CA_Certificate.pem --verification-certificate file://Verification.crt --set-as-active --allow-auto-registration
{
    "certificateArn": "arn:aws-cn:iot:cn-north-1:037047667284:cacert/6713ebaf9c20cddc742fb91207216ecdda87bf0f0b719e49c28fede72e87e6e6",
    "certificateId": "6713ebaf9c20cddc742fb91207216ecdda87bf0f0b719e49c28fede72e87e6e6"
}

在这里插入图片描述

生成设备私钥和csr

openssl genrsa -out Device.key 2048
openssl req -new -key Device.key -out Device_Certificate.csr

使用ca签发设备证书

openssl x509 -req -in Device_Certificate.csr -CA CA_Certificate.pem -CAkey CA_Private.key -CAcreateserial -out Device_Certificate.crt -days 3650 -sha256

在设备上安装设备证书

!!!重要

  • 此ca证书并非aws签发,因此显示在Certificate authorities中
  • 外部设备使用该三方证书签发的设备证书访问iot会自动创建Certificates(并非ca certificates)
  • 之后需要为该设备绑定策略授权

也可以在控制台直接生成上面的这些,区别在于自动生成的实际上是由aws ca签发的

  • 可以直接签发,设备私钥和证书一起生成
  • 或者创建设备私钥和csr后,使用aws ca签发

在这里插入图片描述

当 IoT 设备第一次连接 AWS IoT Core 时,如果它集成的设备证书是由已在 Core 上注册的 CA 证书签发而来,那么相应的设备证书会实现自动注册

  • 注册后的默认状态为“PENDING_ACTIVATION”,意味着虽然设备证书已经成功注册,但是还处于等待激活的状态。同时,这个连接动作默认会发一条消息到 AWS IoT Core 的 MQTT Topic “$aws/events/certificates/registered/” 上,格式如下

    {
        "certificateId": "<certificateID>",
        "caCertificateId": "<caCertificateId>",
        "timestamp": "<timestamp>",
        "certificateStatus": "PENDING_ACTIVATION",
        "awsAccountId": "<awsAccountId>",
        "certificateRegistrationTimestamp": "<certificateRegistrationTimestamp>"
    }
    
  • 可以通过iot规则触发lambda函数完成证书激活

通过lambda函数授权,主要逻辑如下

  • 创建policy
  • 附加在证书上
  • 激活证书
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);
        }
      });
    });
  });
}

在控制台订阅此ca

在这里插入图片描述

在ec2上下载mosquitto

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

合并证书链

cd cert
cat Device_Certificate.crt CA_Certificate.pem > Device_CA_Certificate.crt

发布消息,连接会失败

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

证书自动创建

在这里插入图片描述

关联admin权限(iot策略)后再次连接

成功连接

在这里插入图片描述

#对于自动生成的证书
mosquitto_sub --cafile AmazonRootCA1.pem --cert 94505e987e73a5b0e380bb25a68bea19874d741b3907cdef0ba903eeef6d9049-certificate.pem.crt  --key 94505e987e73a5b
0e380bb25a68bea19874d741b3907cdef0ba903eeef6d9049-private.pem.key -h a1zwdkk9p50qtr.ats.iot.cn-north-1.amazonaws.com.cn  -p 8883 -q 0 -t sensor -d

控制台订阅test的topic,成功收到消息

在这里插入图片描述

创建thing的逻辑和上面几乎一致,只不过证书可以选择多种方式

使用mosquitto模拟连接后活动能够看到记录

  • 可以看到连接记录和保活记录
# mosquitto_sub --cafile AmazonRootCA1.pem --cert Device_CA_Certificate.crt --key Device.key -h a1zwdkk9p50qtr.ats.iot.cn-north-1.amazonaws.com.cn  -p 8883 -q 1 -t sensor
s/switch/livingroom/open -i bubble --tls-version tlsv1.2  -d
Client bubble sending CONNECT
Client bubble received CONNACK (0)
Client bubble sending SUBSCRIBE (Mid: 1, Topic: sensors/switch/livingroom/open, QoS: 1, Options: 0x00)
Client bubble received SUBACK
Subscribed (mid: 1): 1
Client bubble sending PINGREQ
Client bubble received PINGRESP
  • id为设备名称,用于区分不同的设备证书

在这里插入图片描述

测试发布消息

在这里插入图片描述

在mosquitto成功收到消息

在这里插入图片描述

自签证书JITP

步骤类似,但是使用模板自动在iot上注册

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/643958.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis 性能管理

一、Redis 性能管理 #查看Redis内存使用 172.168.1.11:6379> info memory 1. 内存碎片率 操作系统分配的内存值 used_memory_rss 除以 Redis 使用的内存总量值 used_memory 计算得出。内存值 used_memory_rss 表示该进程所占物理内存的大小&#xff0c;即为操作系统分配给…

谈谈你对 vue 的理解 ?

1.谈谈你对 vue 的理解 ? 官方: Vue是一套用于构建用户界面的渐进式框架,Vue 的核心库只关注视图层 2. 声明式框架 Vue 的核心特点,用起来简单。那我们就有必要知道命令式和声明式的区别! 早在 JQ 的时代编写的代码都是命令式的,命令式框架重要特点就是关注过程 声明…

13个PyTorch深度学习案例简介

本文整理《PyTorch深度学习与企业级项目实战》中项目案例所使用的模型&#xff0c;方便大家在学习、研究深度学习过程中做训练使用&#xff0c;这些案例也适合作为课程论文、毕业论文的素材&#xff0c;值得收藏和推荐。 第6章 迁移学习花朵识别项目实战 花朵数据集 ResNet…

Unity射击游戏开发教程:(26)创建绕圈跑的效果

unity游戏 在本文中,我将介绍如何为敌人创建圆周运动。gif 中显示的确切行为是敌人沿着屏幕向下移动,直到到达某个点,一旦到达该点,它就会绕圈移动。

F28034中断

DSP中断 中断中断概述中断机制 中断 当CPU正在执行程序时&#xff0c;由于发生了某种随机的事件&#xff08;外部或内部&#xff09;&#xff0c;使CPU的执行中断&#xff0c;转而去执行某一段特殊的程序&#xff08;中断子程序或中断处理程序&#xff09;&#xff0c;以处理该…

LeetCode算法题:42. 接雨水(Java)

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3…

(完全解决)Python字典dict如何由键key索引转化为点.dot索引

文章目录 背景解决方案基础版升级版 背景 For example, instead of writing mydict[‘val’], I’d like to write mydict.val. 解决方案 基础版 I’ve always kept this around in a util file. You can use it as a mixin on your own classes too. class dotdict(dict)…

前端 JS 经典:Web 性能指标

什么是性能指标&#xff1a;Web Performance Metrics 翻译成 Web 性能指标&#xff0c;一般和时间有关系&#xff0c;在短时间内做更多有意义的事情。 一个站点表现得好与不好&#xff0c;标准在于用户体验&#xff0c;而用户体验好不好&#xff0c;有一套 RAIL 模型来衡量。这…

基于SpringBoot的网盘系统设计与实现

第1章 绪论... 1 1.1 研究背景与意义... 1 1.1.1 研究背景... 1 1.1.1 研究意义... 1 1.2 国内外研究现状... 2 1.2.1 国内研究现状... 2 1.2.2 国外研究现状... 3 1.3 论文组织架构... 4 第2章 关键技术介绍... 5 2.1 SpringBoot. 5 2.2 MySQL数据库... 5 2.3 MVC架…

Altium Designer 中键拖动,滚轮缩放,并修改缩放速度

我的版本是AD19&#xff0c;其他版本应该都一样。 滚轮缩放 首先&#xff0c;要用滚轮缩放&#xff0c;先要调整一下AD 设置&#xff0c;打开Preferences&#xff0c;在Mouse Wheel Configuration 里&#xff0c;把Zoom Main Window 后面Ctrl 上的对勾取消掉&#xff0c;再把…

下载和安装AD19 - Altium Designer 19.1.9 Build 167

虽然有AD24 的安装资源&#xff0c;但是我比较喜欢19 这个数字[doge] 下载 仍然是从毛子网站源头进货&#xff1a;https://rutracker.net/forum/viewtopic.php?t5754276&#xff0c;网盘: https://pan.baidu.com/s/1ic31N4h7HS2FBu7JFll0YQ?pwdvjum 提取码: vjum 安装 压…

IDEA主题Drcula个性化改造

Darcula 主题整体色调看着舒服&#xff0c;但是代码区分不直观&#xff0c;比如直接看代码是看不出这个这个是类、接口、抽象类、枚举还是啥&#xff0c;而且左侧图标也很难区分。 该主题基于Darcula主题对类、接口、抽象类、注解在编辑区按颜色做了区分&#xff0c;同时图标也…

Nature期刊的等级和分类

Nature期刊不用过多介绍&#xff0c;学术界人员都对其有所了解&#xff0c;可以和Science&#xff0c;Cell比肩&#xff0c;Nature旗下创办了很多子刊&#xff0c;系列期刊有一百多种&#xff0c;当然其含金量各有不同&#xff0c;nature旗下的期刊等级你是否都了解了。 Nature…

通过继承React.Component创建React组件-5

在React中&#xff0c;V16版本之前有三种方式创建组件&#xff08;createClass() 被删除了)&#xff0c;之后只有两种方式创建组件。这两种方式的组件创建方式效果基本相同&#xff0c;但还是有一些区别&#xff0c;这两种方法在体如下&#xff1a; 本节先了解下用extnds Reac…

题解:CF1016E Rest In The Shades

题意 平面上有一个点光源 s s s 并以每秒 1 1 1 单位长度的速度从点 ( a , s y ) (a,sy) (a,sy) 移动到点 ( b , s y ) (b,sy) (b,sy)&#xff0c;其中 s y < 0 sy<0 sy<0&#xff1b;在 x x x 轴正方向上有 n n n 不相交、不接触的挡板&#xff0c;第 i i i …

ESP32烧录AT固件并进行MQTT通讯

首先下载AT固件 发布的固件 - ESP32 - — ESP-AT 用户指南 latest 文档 下载烧录工具 下载指导 - ESP32 - — ESP-AT 用户指南 latest 文档 烧录后注意usb的串口是不能发AT指令的 需要用16和17脚 用AT指令确认OK后连WIFI ATCWMODE1 //设置客户端模式 ATCWLAP …

CSS伪类实现input聚焦时,上层div样式改变

CSS伪类实现input聚焦时&#xff0c;上层div样式改变 可以使用:focus-within伪类选择器&#xff0c;它会在div内的任何元素获得焦点时选择该div&#xff0c;明确的是&#xff0c;获得焦点和被点击是不相等的&#xff0c;div能被点击&#xff0c;但是不能获得焦点&#xff0c;也…

Kubernetes部署dashboard

Kubernetes部署dashboard Kubernetes集群安装 鲲鹏arm64架构下安装KubeSphere linux安装部署k8s(kubernetes)和解决遇到的坑 dashboard部署 $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashbo…

Qt学习记录(14)线程

前言&#xff1a; 我的臀部已经翘到可以顶起一屁股债了 为什么要使用线程 什么时候用线程 复杂的数据处理 头文件.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer>//定时器头文件QT_BEGIN_NAMESPACE namespace Ui { class Widget; }…

Unity功能——设置Camera,实现玩家被攻击后晃动效果

一、方法说明&#xff1a; 来源&#xff1a;siki学院&#xff1a;Unity项目捕鱼达人&#xff0c;功能学习记录&#xff1b; 效果摘要&#xff1a;通过调整相机移动&#xff0c;视觉感觉玩家面板剧烈晃动&#xff0c;实现被boss攻击时的震动效果。 使用场景说明&#xff1a; …