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

这篇具有很好参考价值的文章主要介绍了QtMqtt使用SSL加密协议传输教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

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

下载

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

编译源码

mqtt与ssl,SSL,QT5,ssl,qt,网络协议,安全
如果你的是linux或者ARM也是如此编译,但是如果是ARM板子,需要先配置交叉编译环境,配置交叉编译环境可以看我以往的文章。https://blog.csdn.net/qq_42851716/article/details/124447518 。

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

mqtt与ssl,SSL,QT5,ssl,qt,网络协议,安全
然后把 mqtt库文件添加到 D:\QT5.12.12\5.12.12\mingw73_64\lib

mqtt与ssl,SSL,QT5,ssl,qt,网络协议,安全
在工程中使用
mqtt与ssl,SSL,QT5,ssl,qt,网络协议,安全

添加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版本

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

我这边下载的是
mqtt与ssl,SSL,QT5,ssl,qt,网络协议,安全

配置SSL

当下载好openssl库以后,将.dll的库文件添加到本地qt安装目录库,D:\QT5.12.12\5.12.12\mingw73_64\bin
mqtt与ssl,SSL,QT5,ssl,qt,网络协议,安全
然后再 qDebug() << QSslSocket::supportsSsl(); 返回true,说明配置完成。
mqtt与ssl,SSL,QT5,ssl,qt,网络协议,安全

测试

使用开源的MQTT服务器做测试 :https://test.mosquitto.org/
到mosquitto下载证书,
mqtt与ssl,SSL,QT5,ssl,qt,网络协议,安全
然后配置

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();

我使用的是第一种方式,测试成功。文章来源地址https://www.toymoban.com/news/detail-791694.html

到了这里,关于QtMqtt使用SSL加密协议传输教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HTTP协议 和 HTTPS协议的区别(4点) && HTTPS如何使用SSL/TLS协议加密过程 && CA证书干啥的

      1. HTTP协议的端口号是80, HTTPS协议的端口号是443 2. HTTP协议使用的URL是以 http:// 开头,HTTPS协议使用的URL是以https://开头 3. HTTP协议和HTTPS协议最主要的区别是: HTTP协议所生成的HTTP请求报文被TCP协议 以明文形式透明传输,同时 客户端与服务器之间无法核验对方的身份(不晓

    2024年02月14日
    浏览(32)
  • HTTP协议 和 HTTPS协议的区别(4点) && HTTPS的缺点 && HTTP如何使用SSL/TLS协议加密过程 && CA证书干啥的

      1. HTTP协议的端口号是80, HTTPS协议的端口号是443 2. HTTP协议使用的URL是以 http:// 开头,HTTPS协议使用的URL是以https://开头 3. HTTP协议和HTTPS协议最主要的区别是: HTTP协议所生成的HTTP请求报文被TCP协议 以明文形式透明传输,同时 客户端与服务器之间无法核验对方的身份(不晓

    2024年02月14日
    浏览(36)
  • HTTPS加密协议详解:TLS/SSL握手过程

    基于RSA握手和密钥交换的客户端验证服务器为示例详解TLS/SSL握手过程。 (1).client_hello 客户端发起请求,以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩展字段等信息,相关信息如下: 支持的最高TSL协议版本version,从低到高依次 SS

    2024年02月09日
    浏览(25)
  • 客户端和服务器不支持一般SSL协议版本或加密套件解决方法

    最近在阿里云服务器上给我的 程序员导航网站 配置CDN加速,配置完成后,浏览器访问页面显示:配置https协议,访问出现客户端和服务器不支持一般SSL协议版本或加密套件,此网站无法提供安全连接 www.xxxxxx.com 使用了不受支持的协议。  于是我咨询了阿里云售后技术工程师

    2024年02月07日
    浏览(40)
  • 使用 SSL/TLS 加强 MQTT 通信安全

    在之前的文章中,我们探讨了认证和访问控制机制。接下来,我们将介绍传输层安全协议(TLS)在提升 MQTT 通信安全方面的重要作用。本文将着重介绍 TLS 以及它如何保证 MQTT 通信的完整性、机密性和真实性。 在开始之前,让我们先来了解几个关键概念。 握手:TLS 握手是客

    2024年02月13日
    浏览(24)
  • 【软考网络管理员】2023年软考网管初级常见知识考点(18)-安全协议SSL与PGP、数据加密技术

    安全套接层协议SSL详解,PGP协议是什么?数据加密技术有哪些?软考网络管理员常考知识点,软考网络管理员网络安全,网络管理员考点汇总。 原创于:CSDN博主-《拄杖盲学轻声码》,更多考点汇总可以去他主页查看 更多考试总结可关注CSDN博主-《拄杖盲学轻声码》 SSL可以对

    2024年02月11日
    浏览(30)
  • 使用Netty实现SSL和TLS加密通信

            Netty支持使用SSL和TLS协议进行加密通信,可以在保证通信安全的同时,保证数据传输的完整性和可靠性。下面我们将演示如何使用Netty实现SSL和TLS加密通信。 首先,我们需要生成一个SSL证书,用于进行加密通信。可以使用OpenSSL等工具生成证书,也可以使用Netty提供

    2024年02月13日
    浏览(31)
  • 解决QT5使用网络组件报错:qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed问题

    1、根据报错提示,问题出现的原因就是缺少加密的手段,因为HTTPS 协议在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。出现问题的原因也就是没有提供对HTTP加密的工具,从而无法进行HTTPS通信。 2、解决办法: 首先通过调试语句查看自己QT所使用的

    2024年02月14日
    浏览(30)
  • 【Netty】使用 SSL/TLS 加密 Netty 程序(二十)

    回顾Netty系列文章: Netty 概述(一) Netty 架构设计(二) Netty Channel 概述(三) Netty ChannelHandler(四) ChannelPipeline源码分析(五) 字节缓冲区 ByteBuf (六)(上) 字节缓冲区 ByteBuf(七)(下) Netty 如何实现零拷贝(八) Netty 程序引导类(九) Reactor 模型(十) 工作原理

    2024年02月07日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包