使用自签发CA证书为EMQX开启双向认证

news2024/10/7 7:25:35

文章目录

  • 背景信息
  • 1、CA证书信任模型
  • 2、创建证书
    • 2.1 Root CA 证书创建
    • 2.2 emqx 服务端证书签发
    • 2.3 中间CA证书签发
    • 2.4 设备证书签发
  • 3、配置EMQX服务端证书
  • 4、客户端使用TLS连接EMQX


背景信息

   本文主要介绍了通过建立三层CA证书链,为EMQX集群提供PKI服务,实现客户端与云端的双向认证。EMQX集群部署,请参考:支持上亿物联网终端设备接入的MQTT集群。

1、CA证书信任模型

在这里插入图片描述
  根CA为EMQX服务签发服务器端证书,以及给中间CA签发中间证书,由中间CA给设备签发设备证书。

2、创建证书

  使用不同的 CA 服务,证书签发的流程以及需要的参数不同,如大部分支持安全芯片的设备,其私钥通常由设备端生成,通过向 CA 发送 csr 请求文件的方式获取CA机构签发的证书。下文仅借助流行的 cfssl 工具来完成证书的创建工作,设备端私钥由 cfssl 工具生成,如果尚未安装 cfssl 工具,请查看 cfssl 工具下载相关文章

2.1 Root CA 证书创建

  • 创建 ca-csr.json
{
  "CN": "emqx",
  "key": {
      "algo": "rsa",
      "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "Hubei",
      "L": "Wuhan",
      "O": "emqx",
      "OU": "system"
    }
  ],
  "ca": {
          "expiry": "87600h"
  }
}
  • 创建根CA私钥与公钥
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

  通过上边命令得到根CA的私钥 ca-key.pem 以及Root CA的字签名根证书 ca.pem

  • 创建CA签发证书的配置文件 ca-config.json
{
  "signing": {
      "default": {
          "expiry": "87600h"
        },
      "profiles": {
          "emqx": {
              "usages": [
                  "signing",
                  "key encipherment",
                  "server auth",
                  "client auth"
              ],
              "expiry": "87600h"
          }
      }
  }

2.2 emqx 服务端证书签发

  • 创建 emqx-server-csr.json 文件
{
  "CN": "emqx",
  "hosts": [
    "*"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "Hubei",
      "L": "Wuhan",
      "O": "emqx",
      "OU": "system"
    }
  ]
}
  • 使用Root CA 私钥签发 emqx 服务端证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=emqx emqx-server-csr.json | cfssljson -bare emqx-server

  通过上边的命令,将会得到 emqx 服务端的私钥 emqx-server-key.pem,以及证书文件 emqx-server.pem. 这两个文件将会写入到 EMQX 配置文件 /etc/emqx/emqx.conf

2.3 中间CA证书签发

  • 创建 emqx-intermediate-csr.json 文件
{
  "CN": "emqx",
  "hosts": [
    "*"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "Hubei",
      "L": "Wuhan",
      "O": "emqx",
      "OU": "system"
    }
  ]
}
  • 使用Root CA 私钥签发中间CA的证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=emqx emqx-intermediate-csr.json | cfssljson -bare emqx-intermediate

  通过上边的命令,将会得到中间CA的私钥 emqx-intermediate-key.pem,以及中间CA的证书 emqx-intermediate.pem。中间CA的证书将会被写入到 EMQX 配置文件 /etc/emqx/emqx.conf 中。

2.4 设备证书签发

  • 创建设备证书签发配置参数模板文件 emqx-device-csr.json
{
  "CN": "emqx",
  "hosts": [
    "*"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "Hubei",
      "L": "Wuhan",
      "O": "emqx",
      "OU": "system"
    }
  ]
}
  • 为设备A签发证书
cfssl gencert -ca=emqx-intermediate.pem -ca-key=emqx-intermediate-key.pem -config=ca-config.json -profile=emqx emqx-device-csr.json | cfssljson -bare emqx-device-A

   通过指定上边命令将会得到设备A的私钥 emqx-device-A-key.pem,以及设备A的证书 emqx-device-A.pem

  • 为设备B签发证书
cfssl gencert -ca=emqx-intermediate.pem -ca-key=emqx-intermediate-key.pem -config=ca-config.json -profile=emqx emqx-device-csr.json | cfssljson -bare emqx-device-B

   通过指定上边命令将会得到设备A的私钥 emqx-device-B-key.pem,以及设备A的证书 emqx-device-B.pem。如需给更多的设备签发证书,只需将上边的参数 emqx-device-B 换成其他设备名称即可。

3、配置EMQX服务端证书

  emqx 默认的配置文件在 /etc/emqx/emqx.conf 中,修改配置文件,添加 ssl 证书配置信息,以及开启双向认证。

listeners.ssl.default {
  bind = "0.0.0.0:8883"
  max_connections = 512000
  ssl_options {
    keyfile = "/etc/ssl/emqx/emqx-server-key.pem"
    certfile = "/etc/ssl/emqx/emqx-server.pem"
    cacertfile = "/etc/ssl/emqx/emqx-intermediate.pem"
    verify = verify_peer
    # 强制开启双向认证,如果客户端无法提供证书,则 SSL/TLS 连接将被拒绝
    fail_if_no_peer_cert = true
  }
}
  • keyfile: 设置 emqx 服务端私钥文件
  • certfile:设置 emqx 服务端证书文件
  • cacertfile:设置为终端签发证书的CA机构证书

ssl 配置修改完成后,需要重启 emqx 服务,在重启服务之前,建议给证书文件设置可读权限,防止emqx服务端没有权限读取证书文件。

chmod +r /etc/ssl/emqx/*
systemctl restart emqx

4、客户端使用TLS连接EMQX

在这里插入图片描述
   上图是 EMQX 提供的客户端工具,里边设计到的关键参数有:

  • 服务器地址:EMQX 服务的域名或IP地址,协议选择:mqtts://,表示连接EMQX的 ssl 坚挺类型。
  • SSL/TLS:选中开启后,表示客户端与服务端使用 TLS 加密传输,发起连接请求需要携带证书。
  • SSL安全:如果开启该功能项,将会校验证书以及证书链的有效性,由于上问中字签发证书 hosts 没有填写具体的服务器IP或域名,如果开启该功能,将会导致证书校验失败,所以此处没有开启该功能。
  • 证书类型:选择 Self signed 表示使用自签发证书。
  • CA 文件:填写 Root CA 机构的根证书文件;
  • 客户端证书:填写设备证书。
  • 客户端 key 文件:填写设备私钥。
    在这里插入图片描述
      参数设置完成后,点击链接按钮,连接成功后会有提示信息,如上图右上角 已连接 提示消息。同时 emqx 的管理控制台也会有连接成功的客户端信息
    在这里插入图片描述
      到此,通过自签发证书的方式实现了 EMQX 集群与客户端之间的双向认证。EMQX 集群直接与设备采用TLS加密传输,在性能上有一定的损耗,官方建议将设备与云之间的双向认证由负载均衡服务终结,即:设备到负载均衡服务采用双向认证,负载均衡服务终结TLS,然后与 EMQX 集群采用非TLS传输。后续将会选择 HAPorxy 来作为负载均衡服务,实现官方推荐的双向认证服务。敬请期待…

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

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

相关文章

STM32基于库函数新建工程模板

基于库函数版本 准备资料: a) V3.5 固件库包:STM32F10x_StdPeriph_Lib_V3.5.0 这是 ST 官网下载的固件库完 整版,我们光盘目录: 软件资料\STM32 固件库使用参考资料\STM32F10x_StdPeriph_Lib_V3.5.0 我们官方论坛下载地址&#…

C++入门(嵌入式学习)

C入门学习 前言C概述C和C的区别 引用引用概念引用性质引用的应用 C输入和赋值string字符串函数提高函数的默认值默认值的注意事项函数的重载函数重载可能产生的问题扩充 内联函数 前言 C概述 C是一种通用的高级编程语言,它是由Bjarne Stroustrup于20世纪80年代初在…

论文笔记:MEASURING DISENTANGLEMENT: A REVIEW OF METRICS

0 摘要 学习解缠和表示数据中的变化因素是人工智能中的一个重要问题。虽然已经取得了许多关于学习这些表示的进展,但如何量化解缠仍然不清楚。 虽然存在一些度量标准,但对它们的隐含假设、真正衡量的内容以及限制了解甚少。因此,当比较不同的…

睡眠脑电中的神经跨频率耦合函数

导读 人类大脑是一个紧密连接的复杂系统。虽然其结构比较固定,但它可以实现很多不同的功能。其中一个重要的功能是自然睡眠过程,这个过程可以改变意识和随意肌肉活动。在神经层面上,这些改变会伴随着大脑连接的变化。为了揭示这种与睡眠相关…

推荐一个好用的开发工具百宝箱

随着科技不断发展,越来越多的工具在网络上应运而生,方便我们更加高效地完成各种任务。今天我要向大家介绍一款在线工具——码加在线工具 - 做更好的工具,它可以帮助你轻松完成许多繁琐、复杂的工作。 首先,码加在线工具 是一款非…

一维信号进行小波去噪(python)

目录 小波变换小波去噪的原理小波阈值去噪的三个主要方面pywt.threshold函数进行小波去噪对ecg信号进行小波阈值去噪关于阈值输出参考 小波变换 小波变换是一种信号的时间——尺度(时间——频率)分析方法,它具有多分辨分析的特点&#xff0c…

【模型评估】ROC(Receiver operating characteristic)与 AUC

前面,我们提到了混淆矩阵,以及根据混淆矩阵进一步计算得到的敏感度(召回率)、特异度、精确度、准确度、F1 Score等等。那他们的前提都是要首先确定一个截断阈值。 【模型评估】混淆矩阵(confusion_matrix)…

理论粘贴板-背会了避免在大佬面前露馅-常更新

1.OLS说明 最小二乘法。给定序列X(x1,x2…xn),y,估计一个向量A(a0,a1.a2…)令y’a0a1x1a2x2…an*xn, 使得(y’-y)^2最小,计算A。 2.代码如下 来源《python机器学习实践指南》 import patsy import statsmodels.api as sm f ‘Rent ~ Zip Beds’ y, X patsy.dmat…

嘀嗒陪诊完整后台+前端全套小程序代码v1.0.8

就医相关陪护服务升级是未来发展趋势,嘀嗒陪诊是一个可以长期深耕持续运营的项目,并可借此切入拓展衔接养老、护理等领域。 嘀嗒陪诊小程序功能相对简单,后台也简捷,如果只是做个陪诊服务的小程序也基本能满足了,整体…

python基本语法知识(四)——包和模块

模块 例子1:导入某个模块中的具体功能 # 只导入time模块中的sleep方法,可以直接使用sleep调用不用加time. from time import sleep print("hello") sleep(500) print("fine")# 只导入time模块中的sleep方法,并给sleep起别名为sl f…

2023/6/11

BigDecima BigDecima的作用 用于小数的精确计算用来表示很大的小数 创建对象 创建对象时要注意以下细节 BigDecimal的使用和BigInteger类似,唯一要注意的点是:在使用除法时,如果除不尽就要设置精确到几位,否则报错 使用除法时的几…

模拟实现qsort函数(采用冒泡的方式),超详细!!!

函数详解和使用 函数声明 void qsort (void* base, size_t num, size_t size,int (*cmp)(const void* e1,constvoid* e2)); 头文件 stdlib.h 参数 base-- 指向要排序的数组的第一个元素的指针。 num-- 由 base 指向的数组中元素的个数。 size-- 数组中每个元素的大小&a…

高精度电压源的应用场合有哪些

高精度电压源是一种能够提供恒定、稳定电压输出的设备,被广泛应用于各种领域。高精度电压源是现代电力、通信、控制等领域中重要的测试仪器之一,其主要功能是提供稳定可靠的直流或交流电源,并具有高精度和高分辨率的特点。在实际应用中&#…

kotlin 解决构造函数兼容性问题

data class Person(private val head: String,val hand: String ) {} val p Person("head", "hand")Log.d("Alex", "Person $p") 打印结果: 2023-06-11 22:30:54.764 21840-21840 Alex com.example…

智能diy官网小程序至尊版v1.0.73+微信前端

🎈 限时活动领体验会员:可下载程序网创项目短视频素材 🎈 🎉 有需要的朋友记得关赞评,文章底部来交流!!! 🎉 ✨ 源码介绍 1、h5万*能页增加跳转小程序组件 2、功能链接弹…

智能工具Cursor安装和使用

一、Cursor介绍 Cursor.so是一个软件开发工具,是一个集成了 GPT的直接可以访问的,优秀而强大的智能AI代码生成工具,使用GPT-3.5免费。 它可以快速编写、编辑和聊天关于你的代码。它支持多种编程语言,如Python、Java、JavaScript等…

BootStrap文档

Bootstrap概念 ​ 1. 概念: 一个前端开发的框架,Bootstrap,来自 Twitter,是目前很受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JavaScript 的,它简洁灵活,使得 Web 开发更加快捷。 ​ 框架:一个半成品…

C++教程(06)——变量类型

C 变量类型 变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。 变量的名称可以由字母、数字和下划线字符组成。它必须以字母…

037_SS_SyncDiffusion: Coherent Montage via Synchronized Joint Diffusions

SyncDiffusion: Coherent Montage via Synchronized Joint Diffusions 1. Motivations & Arguments & Contributions 本文提出了一种即插即用的用Diffusion生成全景图的方法。 Diffusion模型通常只能生成固定大小的图像,为了生成分辨率比较高的全景图。现…

linux shell操作-基本脚本编写

文章目录 变量分支循环函数函数案例 变量 普通变量 声明变量,直接赋值,同python两边不能有空格‘’ 单引号表示纯字符“”双引号表示一个整体反引号表示操作命令末尾没有;号 # 直接赋值, namejack # 纯字符 pyCodeimport os\n…