QtMqtt使用SSL加密协议传输教程

概述

Qt开发MQTT程序有两种方式,一个是Qt官方提供的基于MQTT的封装,一个是第三方(EMQ)开发的用于Qt调用MQTT的接口,二者使用方法大同小异,并且均提供了源码。最好使用Qt官方提供的封装来使用MQTT。

下载

Qt官方在github上提供了源代码,地址:https://github.com/qt/qtmqtt
下载
mqtt源码版本要跟自己qt版本相同,不然会有各种问题,我这边下载了qtmqtt 5.12.12版本。

编译源码

编译
如果你的是linux或者ARM也是如此编译,但是如果是ARM板子,需要先配置交叉编译环境,配置交叉编译环境可以看我以往的文章。https://blog.csdn.net/qq_42851716/article/details/124447518

然后编译完成以后window版本会有*.dll的库文件,
库文件
此时需要把mqtt编译后的库文件和头文件加入到qt安装目录里面,也可以单独在工程里面添加。
这里添加到工程目录,首先将mqtt头文件全部提取。
头文件
然后新建文件夹QtMqtt,将刚刚提取的.h文件全部复制到文件夹内,
头文件
最后将头文件添加到QT安装路径的 D:\QT5.12.12\5.12.12\mingw73_64\include

添加头文件
然后把 mqtt库文件添加到 D:\QT5.12.12\5.12.12\mingw73_64\lib

添加库文件
在工程中使用
添加头文件

添加OpenSSL,也是重头戏

所属模块:QT += network
由于关于QT的SSL资料网上不多,也是我写这篇文章的原因,关于SSL的介绍这里就赘述了,QtMqtt的SSL看官网文档介绍也是支持的,但是没有集成SSL的库文件,所以需要我们下载openssl的库文件,添加到qt安装目录。
QT的官方文档:
https://doc.qt.io/archives/qt-5.12/ssl.html
https://doc.qt.io/archives/qt-5.5/opensslsupport.html

下载openssl库文件

验证是否支持SSL ,在QT中看
QSslSocket::supportsSsl()返回的是true还是false,如果是false,也就是qt没有找到SSL库文件,
首先查看你QT的SSL版本,使用

 qDebug()<<"QSslSocket="<<QSslSocket::sslLibraryBuildVersionString();    // 输出当前QT支持的openSSL版本

openssl版本
我的ssl版本,"OpenSSL 1.1.1k。到 :https://www.openssl.org/官网下载openssl对应的版本文件。
下载安装有两种方式:
通过源码编译,直接在官网下载源码编译即可,优点是安全,全版本都有,缺点是费事。具体步骤参考:
QT支持https及编译OpenSSL
使用第三方编译好的安装包:优点是省事,缺点是无法确定发布者是否可靠、版本不全。具体步骤参考:Qt 连接 https
:解决OpenSSL问题

我这边下载的是
在这里插入图片描述

配置SSL

当下载好openssl库以后,将.dll的库文件添加到本地qt安装目录库,D:\QT5.12.12\5.12.12\mingw73_64\bin
在这里插入图片描述
然后再 qDebug() << QSslSocket::supportsSsl(); 返回true,说明配置完成。
配置openssl

测试

使用开源的MQTT服务器做测试 :https://test.mosquitto.org/
到mosquitto下载证书,
ssl证书
然后配置

const QByteArray pem_mos = R"(-----BEGIN CERTIFICATE-----
MIIEAzCCAuugAwIBAgIUBY1hlCGvdj4NhBXkZ/uLUZNILAwwDQYJKoZIhvcNAQEL
BQAwgZAxCzAJBgNVBAYTAkdCMRcwFQYDVQQIDA5Vbml0ZWQgS2luZ2RvbTEOMAwG
A1UEBwwFRGVyYnkxEjAQBgNVBAoMCU1vc3F1aXR0bzELMAkGA1UECwwCQ0ExFjAU
BgNVBAMMDW1vc3F1aXR0by5vcmcxHzAdBgkqhkiG9w0BCQEWEHJvZ2VyQGF0Y2hv
by5vcmcwHhcNMjAwNjA5MTEwNjM5WhcNMzAwNjA3MTEwNjM5WjCBkDELMAkGA1UE
BhMCR0IxFzAVBgNVBAgMDlVuaXRlZCBLaW5nZG9tMQ4wDAYDVQQHDAVEZXJieTES
MBAGA1UECgwJTW9zcXVpdHRvMQswCQYDVQQLDAJDQTEWMBQGA1UEAwwNbW9zcXVp
dHRvLm9yZzEfMB0GCSqGSIb3DQEJARYQcm9nZXJAYXRjaG9vLm9yZzCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAME0HKmIzfTOwkKLT3THHe+ObdizamPg
UZmD64Tf3zJdNeYGYn4CEXbyP6fy3tWc8S2boW6dzrH8SdFf9uo320GJA9B7U1FW
Te3xda/Lm3JFfaHjkWw7jBwcauQZjpGINHapHRlpiCZsquAthOgxW9SgDgYlGzEA
s06pkEFiMw+qDfLo/sxFKB6vQlFekMeCymjLCbNwPJyqyhFmPWwio/PDMruBTzPH
3cioBnrJWKXc3OjXdLGFJOfj7pP0j/dr2LH72eSvv3PQQFl90CZPFhrCUcRHSSxo
E6yjGOdnz7f6PveLIB574kQORwt8ePn0yidrTC1ictikED3nHYhMUOUCAwEAAaNT
MFEwHQYDVR0OBBYEFPVV6xBUFPiGKDyo5V3+Hbh4N9YSMB8GA1UdIwQYMBaAFPVV
6xBUFPiGKDyo5V3+Hbh4N9YSMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
BQADggEBAGa9kS21N70ThM6/Hj9D7mbVxKLBjVWe2TPsGfbl3rEDfZ+OKRZ2j6AC
6r7jb4TZO3dzF2p6dgbrlU71Y/4K0TdzIjRj3cQ3KSm41JvUQ0hZ/c04iGDg/xWf
+pp58nfPAYwuerruPNWmlStWAXf0UTqRtg4hQDWBuUFDJTuWuuBvEXudz74eh/wK
sMwfu1HFvjy5Z0iMDU8PUDepjVolOCue9ashlS4EB5IECdSR2TItnAIiIwimx839
LdUdRudafMu5T5Xma182OC0/u/xRlEm+tvKGGmfFcN0piqVl8OrSPBgIlb+1IKJE
m/XriWr/Cq4h/JfB7NTsezVslgkBaoU=
-----END CERTIFICATE-----
)";

 QSslCertificate  cert = QSslCertificate(pem_mos,QSsl::Pem);
 QSslSocket::addDefaultCaCertificate(cert);
 mqtt->setHostname("test.mosquitto.org");  //  
 mqtt->setPort(8883);       //8883
 mqtt->setUsername("xxx");
 mqtt->setPassword("xxxx");
 mqtt->setKeepAlive(10); // 心跳
//    mqtt->connectToHost();  // 连接服务器 不带SSL
  mqtt->connectToHostEncrypted();    //加密SSL

总结

到这里终于实现了SS来加密,不用的QT版本connectToHostEncrypted();参数形式不同,具体的还是要参考QT官方文档。
其实有几种方法:
1、可以全局设置证书,以便所有 QSslSocket 默认使用它:

QSslCertificate cert = QSslCertificate(...);
QSslSocket::addDefaultCaCertificate(cert);

QMqttClient client;
client.setHostname(...);
client.setPort(...);
// ...
client.connectToHostEncrypted();

2、可以使用 QSslConfiguration 来设置证书和/或私钥:

QSslCertificate cert = QSslCertificate(...);
QSslConfiguration conf;
conf.setCaCertificates({cert});
// conf.setPrivateKey();
QSslConfiguration::setDefaultConfiguration(conf);

QMqttClient client;
client.setHostname(...);
client.setPort(...);
// ...
client.connectToHostEncrypted();

我使用的是第一种方式,测试成功。

学习计划安排


我一共划分了六个阶段,但并不是说你得学完全部才能上手工作,对于一些初级岗位,学到第三四个阶段就足矣~

这里我整合并且整理成了一份【282G】的网络安全从零基础入门到进阶资料包,需要的小伙伴可以扫描下方CSDN官方合作二维码免费领取哦,无偿分享!!!

如果你对网络安全入门感兴趣,那么你需要的话可以

点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

①网络安全学习路线
②上百份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥HW护网行动经验总结
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析

  • 16
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值