当前位置: 首页 > news >正文

Qt中https的使用,报错TLS initialization failed和不能打开ssl.lib问题解决

前言

在现代应用程序中,安全地传输数据变得越来越重要。Qt提供了一套完整的网络API来支持HTTP和HTTPS通信。然而,在实际开发过程中,开发者可能会遇到SSL相关的错误,例如“TLS initialization failed”,cant't open ssl.lib等问题。本文将介绍如何在Qt中使用HTTPS进行网络访问,网上搜到的结果大都是错的。这里并提供解决TLS初始化失败和SSL库问题的方法。

一、Qt中使用HTTPS的基本概念

Qt使用QNetworkAccessManagerQNetworkReply类来处理网络请求。对于HTTPS请求,Qt会自动使用SSL/TLS进行加密通信。以下是使用HTTPS的基本步骤:

  1. 创建QNetworkAccessManager实例。
  2. 使用get()post()等方法发起请求。
  3. 连接finished()信号以处理响应。
  4. 检查QNetworkReply的状态和错误。

二、TLS初始化失败的原因

TLS初始化失败通常是因为Qt没有正确配置或找到SSL库。这可能是由于以下原因:

  • 缺少必要的SSL库文件。
  • 编译Qt时未启用SSL支持。
  • 系统环境变量未正确设置。

三、解决TLS初始化失败的步骤

确保你的项目中包含了网络模块(corenetwork模块通常默认包含SSL支持)。

注意,你的yourprj.pro工程文件配置中只需要: QT += network即可。不需要向网上说的那样又是配置CONFIG += openssl又是增加LIBS += -Llib -lssl -lcrypto。这样搞反倒是错的,会报can't open ssl.lib。其实关于ssl的库qt安装时已经包含了,编译时也会自动链接成功,编译成功。

在你的Qt应用程序中,尝试创建一个QSslSocketQSslConfiguration对象,并使用它来发起HTTPS请求。如果Qt支持SSL,这些类应该能够正常使用。能否编译通过,编译通过则没问题。

唯一需要注意的是:

运行后访问https报错,提示TLS initialization failed。这是因为qt自带的libssl-1_1.dll很扯,位置在Qt\Qt5.14.2\Tools\QtCreator\bin\libssl-1_1.dll, 是个32位的库,提供还不提供全啊,缺少64位的库。咋知道它是32位的库?简单办法文本打开后看到PE..L....的内容,说明它是32位的库(64位的库打开后看二进制能看到PE..d..的内容)。解决办法也简单,网上找到64位的库,名字叫libssl-1_1-x64.dll 和libcrypto-1_1-x64.dll,下载后把它放入你的工具链的bin目录下,我的是在 Qt\Qt5.14.2\5.14.2\msvc2017_64\bin下。

简单使用

以下是一个简单的示例,展示如何在Qt中发起HTTPS请求:

首先在工程的pro文件中,增加:

QT += network

包含相应的头文件: 

#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);// 创建网络访问管理器QNetworkAccessManager manager;// 创建请求QNetworkRequest request(QUrl("https://www.example.com"));request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);// 发起HTTPS GET请求QNetworkReply *reply = manager.get(request);// 连接信号以处理响应QObject::connect(reply, &QNetworkReply::finished, [&]() {if (reply->error() == QNetworkReply::NoError) {qDebug() << "HTTPS request succeeded!";qDebug() << "Response:" << reply->readAll();} else {qDebug() << "HTTPS request failed with error:" << reply->errorString();}reply->deleteLater();});// 连接错误信号QObject::connect(reply, &QNetworkReply::errorOccurred, [&](QNetworkReply::NetworkError error) {qDebug() << "Error occurred:" << error;});// 启动事件循环return app.exec();
}

示例中并没有设置SSL配置,因为大多数情况下Qt会自动处理SSL配置。不配置也行。但是,如果你需要自定义SSL配置,可以这样: 

// 获取默认SSL配置
QSslConfiguration sslConfig = QSslConfiguration::defaultConfiguration();// 自定义SSL配置,例如信任特定的CA证书
sslConfig.setPeerVerifyMode(QSslSocket::VerifyPeer);
sslConfig.setProtocol(QSsl::TlsV1_2); // 指定使用TLS 1.2协议// 应用SSL配置到请求
request.setSslConfiguration(sslConfig);

自定义SSL配置通常只在需要特殊配置的情况下使用,例如在自签名证书或特定协议版本的情况下。对于大多数HTTPS请求,Qt的默认配置足够。 

下载文件示例

实现一个通过https链接下载文件的功能:

mainwindows.h头文件中增加:

private:Ui::MainWindow *ui;QTcpServer *server;QTcpSocket *clientSocket;QNetworkAccessManager *networkManager;QNetworkReply *networkReply;QFile *m_file;QString m_videoUrl;
}

void MainWindow::onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{if (bytesTotal > 0) {int progress = static_cast<int>((bytesReceived * 100) / bytesTotal);ui->te_result->append(QString("Download progress: %1%").arg(progress));ui->progress->setValue(progress);}
}void MainWindow::onFinished()
{if (networkReply->error()) {ui->te_result->append(QString("Download failed: %1").arg(networkReply->errorString()));} else {m_file->write(networkReply->readAll());m_file->close();ui->te_result->append("Download completed");}networkReply->deleteLater();networkReply = nullptr;if (m_file) {m_file->deleteLater();m_file = nullptr;}
}void MainWindow::on_btnDown_clicked()
{// 开始下载视频if(!m_videoUrl.isEmpty()){ui->te_result->append("begin download:");QUrl url(m_videoUrl);QNetworkRequest request(url);networkReply = networkManager->get(request);connect(networkReply, &QNetworkReply::downloadProgress, this, &MainWindow::onDownloadProgress);connect(networkReply, &QNetworkReply::finished, this, &MainWindow::onFinished);// 创建文件m_file = new QFile("downloaded_video.mp4", this);if (!m_file->open(QIODevice::WriteOnly)) {ui->te_result->append("Failed to open file for writing");delete m_file;m_file = nullptr;return;}}else{ui->te_result->append("begin download:");ui->te_result->append("error,no videoUrl!");return;}}

其他资源

QT5.14.2使用webkit引擎完成网页浏览-腾讯云开发者社区-腾讯云 

相关文章:

Qt中https的使用,报错TLS initialization failed和不能打开ssl.lib问题解决

前言 在现代应用程序中&#xff0c;安全地传输数据变得越来越重要。Qt提供了一套完整的网络API来支持HTTP和HTTPS通信。然而&#xff0c;在实际开发过程中&#xff0c;开发者可能会遇到SSL相关的错误&#xff0c;例如“TLS initialization failed”&#xff0c;cantt open ssl…...

P2p网络性能测度及监测系统模型

P2p网络性能测度及监测系统模型 网络IP性能参数 IP包传输时延时延变化误差率丢失率虚假率吞吐量可用性连接性测度单向延迟测度单向分组丢失测度往返延迟测度 OSI中的位置-> 网络层 用途 面相业务的网络分布式计算网络游戏IP软件电话流媒体分发多媒体通信 业务质量 通过…...

zookeeper相关总结

1. ZooKeeper 的架构 ZooKeeper 采用主从架构&#xff08;Leader-Follower 模型&#xff09;&#xff0c;包括以下组件&#xff1a; Leader&#xff1a;负责处理所有写请求和协调事务一致性。Follower&#xff1a;处理读请求并转发写请求给 Leader。参与 Leader 选举和事务提…...

【openwrt】Openwrt系统新增普通用户指南

文章目录 1 如何新增普通用户2 如何以普通用户权限运行服务3 普通用户如何访问root账户的ubus服务4 其他权限控制5 参考 Openwrt系统在默认情况下只提供一个 root账户&#xff0c;所有的服务都是以 root权限运行的&#xff0c;包括 WebUI也是通过root账户访问的&#xff0c;…...

【GD32】从零开始学GD32单片机 | WDGT看门狗定时器+独立看门狗和窗口看门狗例程(GD32F470ZGT6)

1. 简介 看门狗从本质上来说也是一个定时器&#xff0c;它是用来监测硬件或软件的故障的&#xff1b;它的工作原理大概就是开启后内部定时器会按照设置的频率更新&#xff0c;在程序运行过程中我们需不断地重装载看门狗&#xff0c;以使它不溢出&#xff1b;如果硬件或软件发生…...

详解曼达拉升级:如何用网络拓扑结构扩容BSV区块链

​​发表时间&#xff1a;2024年5月24日 BSV曼达拉升级是对BSV基础设施的战略性重塑&#xff0c;意在显著增强其性能&#xff0c;运行效率和可扩容。该概念于2018年提出&#xff0c;其战略落地将使BSV区块链顺利过渡&#xff0c;从现有的基于单一集成功能组件的网络拓扑结构&am…...

编译打包自己的云手机(redroid)镜像

前言 香橙派上跑云手机可以看之前的文章&#xff1a; 香橙派5plus上跑云手机方案一 redroid(带硬件加速)香橙派5plus上跑云手机方案二 waydroid 还有一个cuttlefish方案没说&#xff0c;后面再研究&#xff0c;cuttlefish的优势在于可以自定义内核且selinux是开启的&#xf…...

自动驾驶的规划控制简介

自动驾驶的规划控制是自动驾驶系统中的核心组成部分&#xff0c;它负责生成安全、合理且高效的行驶轨迹&#xff0c;并控制车辆按照这个轨迹行驶。规划控制分为几个层次&#xff0c;通常包括行为决策&#xff08;Behavior Planning&#xff09;、轨迹规划&#xff08;Trajector…...

java配置nginx网络安全,防止国外ip访问,自动添加黑名单,需手动重新加载nginx

通过访问日志自动添加国外ip黑名单 创建一个类&#xff0c;自己添加一个main启动类即可测试 import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.json.JSONArray; import org.json.JSONObject; import org.sp…...

ARP协议

计算机网络资料下载&#xff1a;CSDN ARP协议 APR(address resolution protocol):地址解析协议&#xff0c;用于实现从IP地址到MAC地址的映射&#xff0c;即访问目标ip地址的mac地址。 网络层及以上采用的ip地址来标记网络接口&#xff0c;但是以太数据帧的传输&#xff0c;…...

Qt程序图标更改以及程序打包

Qt程序图标更改以及程序打包 1 windows1.1 cmake1.1.1 修改.exe程序图标1.1.2 修改显示页面左上角图标 1.2 qmake1.2.1 修改.exe程序图标1.2.2 修改显示页面左上角图标 2 程序打包2.1 MinGW2.2 Visual Studio 3 参考链接 QT6 6.7.2 1 windows 1.1 cmake 1.1.1 修改.exe程序图…...

普通人还有必要学习 Python 之类的编程语言吗?

在开始前分享一些编程的资料需要的同学评论888即可拿走 是我根据网友给的问题精心整理的对于编程的重要性&#xff0c;这里就不详谈了。 未来&#xff0c;我们和机器的交流会越来越多&#xff0c;编程可以简单看作是和机器对话并分发给机器任务。机器不仅越来越强大&#xff0…...

「Python」基于Gunicorn、Flask和Docker的高并发部署

目标预期 使用Gunicorn作为WSGI HTTP服务器,提供高效的Python应用服务。使用Flask作为轻量级Web应用框架,快速开发Web应用。利用Docker容器化技术,确保应用的可移植性和一致性。实现高并发处理,提高应用的响应速度和稳定性。过程 环境准备:安装Docker和Docker Compose。编…...

在攻防演练中遇到的一个“有马蜂的蜜罐”

在攻防演练中遇到的一个“有马蜂的蜜罐” 有趣的结论&#xff0c;请一路看到文章结尾 在前几天的攻防演练中&#xff0c;我跟队友的气氛氛围都很好&#xff0c;有说有笑&#xff0c;恐怕也是全场话最多、笑最多的队伍了。 也是因为我们遇到了许多相当有趣的事情&#xff0c;其…...

一文了解MySQL的表级锁

文章目录 ☃️概述☃️表级锁❄️❄️介绍❄️❄️表锁❄️❄️元数据锁❄️❄️意向锁⛷️⛷️⛷️ 介绍 ☃️概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0…...

LVS+Keepalive高可用

1、keepalive 调度器的高可用 vip地址主备之间的切换&#xff0c;主在工作时&#xff0c;vip地址只在主上&#xff0c;vip漂移到备服务器。 在主备的优先级不变的情况下&#xff0c;主恢复工作&#xff0c;vip会飘回到住服务器 1、配优先级 2、配置vip和真实服务器 3、主…...

网络安全防御【防火墙安全策略用户认证综合实验】

目录 一、实验拓扑图 二、实验要求 三、实验思路 四、实验步骤 1、打开ensp防火墙的web服务&#xff08;带内管理的工作模式&#xff09; 2、在FW1的web网页中网络相关配置 3、交换机LSW6&#xff08;总公司&#xff09;的相关配置&#xff1a; 4、路由器相关接口配置&a…...

IOS上微信小程序密码框光标离开提示存储密码解决方案

问题&#xff1a; ios密码框输入密码光标离开之后会提示存储密码的弹窗 解决方案 1、在苹果手机上面把 “自动填充密码”关闭&#xff0c;但是苹果这个默认开启&#xff0c;而且大部分客户也不会去自己关闭。 2、欺骗苹果手机&#xff0c;代码实现。 先说解决思路&#xf…...

AWS CDN新增用户ip 地区 城市 响应头

1.需要自定义cdn缓存策略 这里的策略也是先复制之前的cdn策略哈 最后复制完了 全部新增这两条标头key CloudFront-Viewer-Country CloudFront-Viewer-City 2.然后新增cdn函数&#xff0c;应用你写的这个函数 function handler(event) {var request event.request;var respon…...

Elasticsearch基础概念

Elasticsearch 是一款开源的,ESTful风格的 分布式搜索、存储、分析引擎; 常见的使用场景 网站搜索,代码搜索等日志管理与分析,应用系统性能分析,安全指标监控等数据库同步,将数据库某个表的数据同步到elasticsearch上然后提供搜索服务 ES基本概念 文档 我们向elasticsearch存…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...