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

news2024/11/16 4:53:17

参考资料

  • 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上注册

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

制作电子画册速成攻略,快来试试

​当今社会&#xff0c;数字媒体日益普及&#xff0c;电子画册作为一种崭新的展示方式&#xff0c;受到了越来越多人的青睐。它不仅形式新颖&#xff0c;互动性强&#xff0c;而且制作起来也并不复杂。想知道如何快速掌握制作电子画册的技巧吗&#xff1f;我来教你吧。 接下来&…

代码随想录-Day20

654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums…

cmake编译redis6.0源码总结

1配置clion使用cygwin模拟linux环境&#xff0c;先下载cygwin后配置 2导入源码&#xff0c;配置cmake文件 由于redis是基于Linux上的Makefile&#xff0c;所以Windows上需要配置CMakeLists.txt使用cmake工具编译运行。github上已经有人尝试编写CMakeLists.txt文件&#xff0c…

<Python实际应用>用yolov9实现垃圾检测

公司一个项目需要在无人机巡检的画面中识别垃圾和汽车&#xff0c;正好听闻yolov9最新出炉&#xff0c;于是试了一下采用yolov9来搭建该项目 1.下载和部署 下载yolov9:GitHub地址&#xff1a;GitHub代码下载地址 配置环境可以参考之前关于yolov5的文章 Yolov5自学笔记之一-…

计算机毕业设计 | springboot+vue房屋租赁管理系统(附源码)

1&#xff0c;绪论 1.1 课题来源 随着社会的不断发展以及大家生活水平的提高&#xff0c;越来越多的年轻人选择在大城市发展。在大城市发展就意味着要在外面有一处安身的地方。在租房的过程中&#xff0c;大家也面临着各种各样的问题&#xff0c;比如需要费时费力去现场看房&…

2024宝藏工具EasyRecovery数据恢复软件免费版本下载

在这个数字化的时代&#xff0c;数据已经成为我们生活中的重中之重。无论是工作中的重要文件&#xff0c;还是手机中珍贵的照片&#xff0c;我们都依赖着这些数据。然而&#xff0c;数据丢失的情况时有发生&#xff0c;可能是误删&#xff0c;可能是设备故障&#xff0c;更可能…

Java八大类型详解

整数类型 (4种) 整数的类型 类型占用内存空间范围byte [字节]1字节-128 ~ 127存放的范围是>二进制short [短整型]2字节 -(2⁵) ~ 2⁵-1 -32768 ~ 32767 int [整形]4字节 -2 ~ 2-1 -2147483648 - 2147483647 long [长整形]8字节-2⁶ ~ 2⁶-1 整数类型的使用细节 1. Java个…

架构师必考题--软件系统质量属性

软件系统质量属性 1.质量属性2.质量属性场景描述3.系统架构评估 这个知识点是系统架构师必考的题目&#xff0c;也是案例分析题第一题&#xff0c; 有时候会出现在选择题里面&#xff0c;考的分数也是非常高的。 1.质量属性 属性说明可用性错误检测/恢复/避免性能资源需求/管理…

元组的创建和删除

目录 使用赋值运算符直接创建元组 创建空元组 创建数值元组 删除元组 自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 元组&#xff08;tuple&#xff09;是Python中另一个重要的序列结构&#…

异方差的Stata操作(计量114)

以数据集 nerlove.dta 为例&#xff0c;演示如何在 Stata 中处理异方差。 此数据集包括以下变量&#xff1a; tc ( 总成本 ) &#xff1b; q ( 总产量 ) &#xff1b; pl ( 工资率 ) &#xff1b; pk ( 资本的使用成本 ) &#xff1b; pf ( 燃料价格 ) &#xff1b; …

H3CNE-7-TCP和UDP协议

TCP和UDP协议 TCP&#xff1a;可靠传输&#xff0c;面向连接 -------- 速度慢&#xff0c;准确性高 UDP&#xff1a;不可靠传输&#xff0c;非面向连接 -------- 速度快&#xff0c;但准确性差 面向连接&#xff1a;如果某应用层协议的四层使用TCP端口&#xff0c;那么正式的…

【代码随想录训练营】【Day 27 and 28】【回溯1-2】| Leetcode 77, 216, 17

【代码随想录训练营】【Day 27 and 28】【回溯1-2】| Leetcode 77, 216, 17 需强化知识点 组合问题&#xff1a;感受遍历的横向和纵向 题目 77. 组合 注意path要深拷贝 class Solution:def combine(self, n: int, k: int) -> List[List[int]]:result []def backtrac…

Thymeleaf 搭建家居网首页

文章目录 1.引入Thymeleaf sunliving-commodity模块1.在resources目录下引入Thymeleaf 所需资源2.pom.xml引入Thymeleaf依赖3.application.yml 关闭缓存&#xff0c;使页面实时刷新4.在application-prod.yml开启缓存5.编写com/sun/sunliving/commodity/web/IndexController.jav…

VLAN高级特性

1.VLAN聚合 &#xff08;1&#xff09;VLAN聚合产生的技术背景 &#xff08;2&#xff09;VLAN聚合概述 &#xff08;3&#xff09;VLAN聚合的原理 多个Sub-VLAN共享一个网关地址&#xff0c;节约了子网网络地址、子网定向广播地址、子网缺省网关地址&#xff0c;且各Sub-VLAN…

基于51单片机的超声波液位测量与控制系统

基于51单片机液位控制器 &#xff08;仿真&#xff0b;程序&#xff0b;原理图PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.使用HC-SR04测量液位&#xff0c;LCD1602显示&#xff1b; 2.当水位高于设定上限的时候&#xff0c;对应声光报警报警&am…

【同构字符串】python

思路&#xff1a; 先记录同一个值出现的次数&#xff0c;再将字典中的值取出&#xff0c;比较2个列表即可 代码&#xff1a; class Solution:def isIsomorphic(self, s: str, t: str) -> bool:dit1dict()dit2dict()for i in range(len(s)):if s[i] not in dit1:dit1[s[i…

SQL Server2019安装步骤教程(图文)_最新教程

一、下载SQL Server2019 1.到微软官网下载SQL Server Developer版本&#xff0c;官网当前的2019版本下载需要注册账号。 不想注册的朋友&#xff0c;可以选择从网盘下载&#xff1a;点击此处直接下载 2.下载之后先解压&#xff0c;解压后执行exe安装程序。打开之后的界面如下…

下载 Hugging Face 中的模型文件

下载 Hugging Face 中的模型文件 1. Hugging Face Hub2. ggerganov/whisper.cpp3. 点击图标下载文件4. Clone this model repository5. Using the Hugging Face Client Library6. Using GitReferences 1. Hugging Face Hub The Hugging Face Hub is a platform with over 350k…

linux 常用命令:find grep ps netstat sudo df du rm

rm 命令 删除 -r 是递归参数&#xff08;recursive&#xff09;&#xff0c;用于删除目录及其内容。如果不加这个参数&#xff0c;rm 命令无法删除非空目录。-f 是强制参数&#xff08;force&#xff09;&#xff0c;用于强制删除文件或目录&#xff0c;不会进行任何确认提示…