[MQTT]服务器EMQX搭建SSL/TLS连接过程(wss://)



👉原文阅读


💡章前提示

本文采用8084端口进行连接,是EMQX 默认提供了四个常用的监听器之一,如果需要添加其他类型的监听器,可参考官方文档🔗管理 | EMQX 文档。

本文使用自签名CA,需要提前在Linux系统上安装🔗OpenSSL,具体安装教程请自行搜索。

本文采用SSL/TLS连接,需要提前在EMQX上启用,可参考🔗开启 SSL/TLS 连接| EMQX 文档


目录

    • 👉[原文阅读](https://b1ankc-mov.github.io/posts/emqx_mqtt_ssl_wss/)
      • 💡章前提示
  • 📘正文开始
    • 使用OpenSSL获取证书
      • CA文件
      • Server文件
        • 🔑小贴士
      • Client文件
    • 登录EMQX平台配置服务器
        • 🚩注意
    • 使用MQTTX客户端测试连接
      • 单向认证的SSL/TLS连接
      • 双向认证的SSL/TLS连接


📘正文开始

使用OpenSSL获取证书

CA文件

  1. 打开Linux系统终端操作窗口,输入以下指令,查看OpenSSL是否安装,如果有,则会显示版本信息。
openssl version
  1. 生成私钥:my_root_ca.key
openssl genrsa -out my_root_ca.key 2048
  1. 使用该密钥生成根(CA)证书:my_root_ca.pem
openssl req -x509 -new -nodes -key my_root_ca.key -sha256 -days 3650 -out my_root_ca.pem

系统会提示以下信息,对应含义如下(根据下面的内容填就可以了,#后面的不需要填):

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]: CN # 国家/地区
State or Province Name (full name) [Some-State]:Zhejiang # 省/市
Locality Name (eg, city) []:Hangzhou # 城市
Organization Name (eg, company) [Internet Widgits Pty Ltd]:EMQX # 组织机构(或公司名),如 EMQ
Organizational Unit Name (eg, section) []:EMQX # 机构部门,如 EMQX
Common Name (e.g. server FQDN or YOUR name) []:none # 通用名称,此处应当设置为服务器域名如 mqtt.emqx.com
...

Server文件

  1. 生成EMQX(服务器)端的私钥:emqx.key
openssl genrsa -out emqx.key 2048
  1. 使用 vi命令创建配置文件:openssl.cnf
vi openssl.cnf

文件内容如下,BROKER_ADDRESS 修改为 EMQX 服务器实际的 IP 或 DNS 地址

例如:IP.1 = 127.0.0.1,或 DNS.1 = broker.xxx.com(可以只填IP,把域名DNS那一行删掉)

[req]
default_bits  = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
countryName = CN
stateOrProvinceName = Zhejiang
localityName = Hangzhou
organizationName = EMQX
commonName = Server certificate
[req_ext]
subjectAltName = @alt_names
[v3_req]
subjectAltName = @alt_names
[alt_names]
IP.1 = BROKER_ADDRESS
DNS.1 = BROKER_ADDRESS

​ 最后Esc+:wq 保存并退出

  1. 使用上面的密钥和配置文件签发证书请求:emqx.csr
openssl req -new -key ./emqx.key -config openssl.cnf -out emqx.csr
  1. 使用请求文件、CA密钥、配置文件,以根证书签发EMQX实体证书:emqx.pem
openssl x509 -req -in ./emqx.csr -CA my_root_ca.pem -CAkey my_root_ca.key -CAcreateserial -out emqx.pem -days 3650 -sha256 -extensions v3_req -extfile openssl.cnf

🔑小贴士

准备好Server文件(EMQX证书)后,就可以启用EMQX单向认证的SSL/TLS连接功能了

如果需要双向认证客户端证书和客户端Key文件,用来满足配置nginx等需求的,请继续配置Client文件↓


Client文件

这一部分原理和内容跟配置Server文件一样,不赘述了,直接放步骤。

  1. 生成client.key
openssl genrsa -out client.key 2048
  1. 生成client.csr
openssl req -new -key ./client.key -config openssl.cnf -out client.csr
  1. 生成client.pem
openssl x509 -req -in ./client.csr -CA my_root_ca.pem -CAkey my_root_ca.key -CAcreateserial -out client.pem -days 3650 -sha256 -extensions v3_req -extfile openssl.cnf

登录EMQX平台配置服务器

  1. 将前文中通过OpenSSL工具生成的 emqx.pememqx.keymy_root_ca.pem 文件拷贝到 EMQX 的 etc/certs/ 目录下,并参考如下配置修改 emqx.conf
## listener.ssl.$name is the IP address and port that the MQTT/SSL
## Value: IP:Port | Port
listener.ssl.external = 8084## Path to the file containing the user's private PEM-encoded key.
## Value: File
listener.ssl.external.keyfile = etc/certs/emqx.key## Path to a file containing the user certificate.
## Value: File
listener.ssl.external.certfile = etc/certs/emqx.pem## Path to the file containing PEM-encoded CA certificates. The CA certificates
## Value: File
listener.ssl.external.cacertfile = etc/certs/my_root_ca.pem

博主8084端口部分修改之后是这样的↓

emqx配置文件修改后代码参考

  1. 打开 Dashboard,点击管理 -> 监听器进入监听器管理页面

打开8084端口配置界面,重新设置TLS CertTLS KeyCA Cert,分别对应上传emqx.pememqx.keymy_root_ca.pem文件


🚩注意
  • 这里类型两个字下面框里的内容要提前设置成wss要不然SSL/TLS连接没法用

  • 另外SSL版本最好是这样官方文档建议添加的SSL版本

这些章前的参考文档都说明了,这里再提醒一下,其他设置基本默认,出问题回去看官方文档


  1. 重启EMQX服务器
emqx restart

使用MQTTX客户端测试连接

MQTTX官网🔗:MQTTX:全功能 MQTT 客户端工具

官方安装文档🔗:安装 - MQTTX 文档

官方使用文档🔗:MQTT 客户端工具演示 | EMQX 文档

单向认证的SSL/TLS连接

  1. 打开MQTTX客户端,添加连接,填写信息:

    名称随便填,Client ID随机

    服务器地址选择wss://,后面填IP地址,端口8084

    SSL安全按钮关闭

    证书类型选择CA or Self signed certificates,在CA文件处上传根(CA)证书即可,客户端证书和客户端key文件两栏不填

    MQTT版本3.1.1

单向认证连接设置

单向认证连接设置

  1. 点击连接按钮,连接成功

单向认证连接成功

  1. 发送测试消息,发送成功

单向认证测试消息发送成功

  1. 参考官方使用文档的步骤🔗MQTT 客户端工具演示 | EMQX 文档,创建另一个连接作为消息接受客户端(配置与之前相同),添加订阅,在Topic中输入test

    接着在原来的EMQX_SSL_TEST连接重新发送test消息,客户端会收到新消息

单向认证订阅消息测试成功

双向认证的SSL/TLS连接

除了SSL安全按钮启动和填入客户端证书、key文件之外,与单向认证没有什么区别,具体看图:

双向认证连接设置

至此,所有测试连接成功√,你会在EMQX监听器上看见连接数增加。

参考文章链接:

  1. EMQ X MQTT 服务器启用 SSL/TLS 安全连接
  2. 开启 SSL/TLS 连接 | EMQX 文档
  3. 获取 SSL/TLS 证书 | EMQX 文档
  4. MQTT 客户端工具演示 | EMQX 文档
  5. 管理 | EMQX 文档

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

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

相关文章

【Redis】构建强韧的远程Redis连接与端口保障机制完美指南

【Redis】构建强韧的远程Redis连接与端口保障机制完美指南 大家好 我是寸铁👊 总结了【Redis】构建强韧的远程Redis连接与端口保障机制完美指南✨ 喜欢的小伙伴可以点点关注 💝 前言 在当今的软件开发领域中,远程访问和操作数据存储是极为常见…

华为OD刷题C卷 - 每日刷题 17(字符串序列判定,最长的指定瑕疵度的元音子串)

1、(字符串序列判定): 这段代码是解决“字符串序列判定”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,用于判断字符串S是否是字符串L的有效子串。 main方法首先读取两个字符串S和L,…

分布式锁与信号量详解

一、引言 在分布式系统中,数据的一致性和并发控制是两大核心挑战。分布式锁和信号量作为解决这些问题的关键工具,被广泛应用于各种分布式场景中。本文将对分布式锁和信号量的概念、原理、实现方式以及应用场景进行详细介绍,并通过具体的代码…

STM32项目分享:智能家居安防系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板及元器件图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.c…

Decimal要从str转换以避免精度问题

最近遇到一个python的小数的问题,本来应该很简单的小于判断,无论如何都不正确,而且浮点小数都没问题,但decimal小数有问题,给我整蒙了,后来才发现是对decimal不了解所致,如果你还用float转decim…

翻转二叉树-力扣

翻转二叉树,通过前序遍历的顺序,从根节点开始,将节点的左右子节点一次进行交换即可。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), …

Flowable项目启动报错#java.time.LocalDateTime cannot be cast to java.lang.String

Flowable 项目启动后报错 flow项目第一次启动创建表成功,但是第二次启动时报错信息如下: 1、Error creating bean with name ‘appRepositoryServiceBean’ defined in class 2、Error creating bean with name ‘flowableAppEngine’: FactoryBean t…

立创小tips

立创小tips 原理图中 1-修改图纸属性 保存完,绘制原理图的界面就出现了,然后我们鼠标点击原理图的边缘变成红色就可以高边表格的属性了。 2-鼠标右键可以移动整个原理图 3-查看封装 点击任意一个元器件,在右侧就会显示封装属性&#xff…

基于fabric封装一个简单的图片编辑器(vue 篇)

介绍 前言vue demo版本react 版本 前言 对 fabric.js 进行二次封装,实现图片编辑器的核心功能。核心代码 不依赖 ui响应式框架vue ,react 都适用。 只写了核心编辑相关代码便于大家后续白嫖二次开发 核心代码我就没有打包发布 会 和 业务代码一起放到项目中。 vu…

socket通信(C语言+Python)

在socket文件夹下创建server.c和client.c。 服务端代码&#xff08;server.c&#xff09;&#xff1a; #include <stdio.h> #include <Winsock2.h> void main() {WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested MAKEWORD( 1, 1 );err WSAS…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于日间-日内不确定集的中长期电源扩展规划》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

简说SQLServer

SQLServer是Microsoft公司推出的一种关系型数据库系统&#xff0c;下面将对其进行详细的解析&#xff0c;包括其主要特性、功能、版本介绍等方面&#xff1a; 一、主要特性 高性能设计&#xff1a;SQLServer充分利用WindowsNT的优势&#xff0c;提供高性能的数据库操作。系统…

SpringBoot整合RabbitMQ (持续更新中)

RabbitMQ 官网地址&#xff1a;RabbitMQ: One broker to queue them all | RabbitMQ RabbitMQ 与 Erlang 版本兼容关系​ 3.13.0 26.0 26.2.x The 3.13 release series is compatible with Erlang 26. OpenSSL 3 support in Erlang is considered to be mature and ready for…

kafka-重试和死信主题(SpringBoot整合Kafka)

文章目录 1、重试和死信主题2、死信队列3、代码演示3.1、appication.yml3.2、引入spring-kafka依赖3.3、创建SpringBoot启动类3.4、创建生产者发送消息3.5、创建消费者消费消息 1、重试和死信主题 kafka默认支持重试和死信主题 重试主题&#xff1a;当消费者消费消息异常时&…

数据结构(C语言)之对归并排序的介绍与理解

目录 一归并排序介绍&#xff1a; 二归并排序递归版本&#xff1a; 2.1递归思路&#xff1a; 2.2递归代码实现&#xff1a; 三归并排序非递归版本&#xff1a; 3.1非递归思路&#xff1a; 3.2非递归代码实现&#xff1a; 四归并排序性能分析&#xff1a; 欢迎大佬&#…

【CS.AI】GPT-4o:重新定义人工智能的新标杆

文章目录 1 序言2 GPT-4o的技术亮点3 GPT-4o与前代版本的对比3.1 热门AI模型对比表格GPT-3.5GPT-4GPT-4oBERTT5 3.2 其他 4 个人体验与感受5 结论 1 序言 嘿&#xff0c;大家好&#xff01;今天要聊聊一个超级酷的AI新突破——GPT-4o&#xff01;最近&#xff0c;OpenAI发布了…

libgdx ashley框架的讲解

官网&#xff1a;https://github.com/libgdx/ashley 我的libgdx学习代码&#xff1a;nanshaws/LibgdxTutorial: libgdx 教程项目 本项目旨在提供完整的libgdx桌面教程&#xff0c;帮助开发者快速掌握libgdx游戏开发框架的使用。成功的将gdx-ai和ashley的tests从官网剥离出来,并…

基于SpringBoot和Vue开发的功能强大的图书馆系统(附源码)

基于SpringBoot和Vue开发的功能强大的图书馆系统(附源码) 功能介绍 图书馆系统功能包括: 1、读者端: 智能推荐图书读者在线预约座位读者借阅归还图书图书详情图书评论、评星用户登录、注册、修改个人信息用户自定义图书标签用户报名活动参加活动书架展示和添加删除用户邮…

window.setInterval(func,interval)定时器

window.setInterval()是JavaScript中的方法&#xff0c;用于在指定的时间间隔重复执行某个函数或代码块。它接受两个参数&#xff0c;第一个参数是要执行的函数或代码块&#xff0c;第二个参数是时间间隔&#xff08;以毫秒为单位&#xff09;。 以下是使用window.setInterval…

oracle10g的dataguard测试

sohu老博客的看不了了&#xff0c;只能重新发布记录&#xff1a; windows2003serveroracle10.2.0.1 1.检查归档模式 SQL> archive log list; 数据库日志模式 存档模式 自动存档 启用 存档终点 USE_DB_RECOVERY_FILE_DEST 最早的联机日…