Administrator
Published on 2025-07-05 / 5 Visits
0
0

使用emqx和mqttx测试mqtt/mqtts

EMQX

安装和启动

curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash
apt-get install emqx
systemctl start emqx
emqx start

安装后启动,看到success字样代表启动成功,访问下面连接进入服务后台:

地址:http://IP:18083
账号:admin
密码:public

卸载

systemctl stop emqx
#--purge要加,不然后面重新安装启动会提示/etc/emqx.conf文件丢失
apt remove --purge emqx 
rm -rf /etc/emqx
rm -rf /var/lib/emqx
apt-get autoremove

MQTTS测试

mqtts单向验证

mqtt正常使用mqttx进行连接测试即可,如果是mqtts,emqx默认已启动,可以在服务管理界面进行查看:

创建认证用户数据库和客户端ID/密码:

然后使用mqttx进行连接测试:

需要注意的是,SLL安全(验证服务器证书)需要关闭,不然还是连接不上,因为emqx自己生成的自签名的相关证书文件,其服务器IP跟现有我们测试部署的服务器不是同个IP,所有要验证不通过。

emqx默认会生成自带自签名的相关证书,其路径对应服务器的/etc/emqx/certs下:

这些证书文件的具体功能:

cacert.pem:

用途: 这是CA(证书颁发机构)证书。它通常是您信任的根证书或中间证书。

作用: EMQX服务器使用这个证书来验证客户端提供的证书是否由受信任的CA签发。这用于双向TLS认证(Mutual TLS, mTLS)中的客户端身份验证。如果EMQX配置为验证客户端证书,它会用这个CA证书来检查客户端的client-cert.pem是否有效。

cert.pem:

用途: 这是EMQX服务器的公钥证书。它是由CA(可能是自签名的,也可能是外部CA签发的)签发的。

作用: 当客户端尝试通过MQTTS连接到EMQX时,服务器会将这个证书发送给客户端。客户端使用这个证书来验证服务器的身份,确保它连接的是正确的EMQX服务器,而不是一个冒充的恶意服务器。这是服务器身份验证的关键部分。

key.pem:

用途: 这是与cert.pem配对的服务器私钥。

作用: 这是EMQX服务器用于解密客户端发送的加密数据,以及加密发送给客户端的数据的秘密钥匙。极其重要:这个文件必须严格保密,不能泄露给任何未经授权的人或系统,否则攻击者就可以解密通信内容,甚至冒充服务器。这个私钥与cert.pem一起构成了服务器的身份凭证。

client-cert.pem:

用途: 这是客户端的公钥证书。这个证书通常是由与cacert.pem相关的CA签发的,或者是由EMQX服务器自己签发的(自签名)。

作用: 在双向TLS认证(mTLS)场景下,客户端(比如你的检测工具或设备)在连接EMQX时,需要将这个证书发送给服务器。EMQX服务器会使用cacert.pem来验证这个客户端证书的有效性。这确保了只有拥有有效证书的授权客户端才能连接。

client-key.pem:

用途: 这是与client-cert.pem配对的客户端私钥。

作用: 这是客户端用于解密服务器发送的加密数据,以及加密发送给服务器的数据的秘密钥匙。与服务器私钥一样,这个文件也必须严格保密。客户端使用这对证书和私钥来证明自己的身份给EMQX服务器。

总结一下这些文件的关系和用途:

cert.pem + key.pem: 定义了EMQX服务器的身份,并用于服务器与客户端之间的安全通信加密。

client-cert.pem + client-key.pem: 定义了客户端的身份(在mTLS场景下),并用于客户端与服务器之间的安全通信加密。

cacert.pem: 是验证客户端证书(client-cert.pem)合法性的依据。

mqtts双向验证

开启双向认证,我们需要先生成自签名的证书文件:

openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.pem
openssl genrsa -out emqx.key 2048
//创建openssl.cnf文件,在下面的服务器IP调整为实际服务器IP,具体内容:

[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 = Jiangsu
localityName = Suzhou
organizationName = EMQX
commonName = CA
[req_ext]
subjectAltName = @alt_names
[v3_req]
subjectAltName = @alt_names
[alt_names]
IP.1 = 服务器IP
DNS.1 = 服务器IP
openssl req -new -key ./emqx.key -config openssl.cnf -out emqx.csr
openssl x509 -req -in ./emqx.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out emqx.pem -days 3650 -sha256 -extensions v3_req -extfile openssl.cnf
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=Jiangsu/L=Suzhou/O=EMQX/CN=client"
openssl x509 -req -days 3650 -in client.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out client.pem

执行上面命令后,会在当前目录生成ca.key、ca.pem、client.key、client.pem、emqx.key、emqx.pem六个文件,将其复制到etc/emqx/certs文件夹,然后再下载到本地计算机上备用。

然后在emqx服务后台配置相关证书:

然后在emqx配置相关证书:

然后进行测试即可。

另外注意的是,同个测试,单独配置CA文件,客户端证书和客户端key文件不配置,也不影响正常使用,但是在服务器后台开启强制验证对端证书后,就一定需要这三个证书都填入了:

参考

https://blog.csdn.net/ywt092/article/details/134496250

https://blog.csdn.net/weixin_45146364/article/details/131301236


Comment