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引擎完成网页浏览-腾讯云开发者社区-腾讯云 

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

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

相关文章

RK3399基础部分

1.RK3399介绍 基础特性&#xff1a; 高达1.8GHz的双核Cortex-A72 四核Cortex-A53高达1.4GHz NPU高达3.0TOPS Mali-T860MP4 GPU 双通道DDR3/DDR3L/LPDDR3/LPDDR4 4K超高清H265/H264/VP9 HDR10/HLG H264编码器 双MIPI CSI和ISP USB Type-CGPU: 图形处理器&#xff08;英语&…

【Linux】权限的管理和Linux上的一些工具

文章目录 权限管理chgrpchownumaskfile指令sudo指令 目录权限粘滞位Linux中的工具1.软件包管理器yum2.rzsz Linux开发工具vim 总结 权限管理 chgrp 功能&#xff1a;修改文件或目录的所属组 格式&#xff1a;chgrp [参数] 用户组名 文件名 常用选项&#xff1a;-R 递归修改文…

WEB前端03-CSS3基础

CSS3基础 1.CSS基本概念 CSS是Cascading Style Sheets&#xff08;层叠样式表&#xff09;的缩写&#xff0c;它是一种对Web文档添加样式的简单机制&#xff0c;是一种表现HTML或XML等文件外观样式的计算机语言&#xff0c;是一种网页排版和布局设计的技术。 CSS的特点 纯C…

RocketMQ实现分布式事务

RocketMQ的分布式事务消息功能&#xff0c;在普通消息基础上&#xff0c;支持二阶段的提交。将二阶段提交和本地事务绑定&#xff0c;实现全局提交结果的一致性。 1、生产者将消息发送至RocketMQ服务端。 2、RocketMQ服务端将消息持久化成功之后&#xff0c;向生产者返回Ack确…

星环科技推出语料开发工具TCS,重塑语料管理与应用新纪元

5月30-31日&#xff0c;2024向星力未来数据技术峰会期间&#xff0c;星环科技推出一款创新的语料开发工具——星环语料开发工具TCS&#xff08;Transwarp Corpus Studio&#xff09;&#xff0c;旨在通过全面的语料生命周期管理&#xff0c;极大提升语料开发效率&#xff0c;助…

25_Vision Transformer原理详解

1.1 简介 Vision Transformer (ViT) 是一种将Transformer架构从自然语言处理(NLP)领域扩展到计算机视觉(CV)领域的革命性模型&#xff0c;由Google的研究人员在2020年提出。ViT的核心在于证明了Transformer架构不仅在处理序列数据&#xff08;如文本&#xff09;方面非常有效&…

算法 —— 高精度(模拟)

目录 加法高精度 两个正整数相加 两个正小数相加 两正数相加 减法高精度 两个正整数相减 两个正小数相减 两正数相减 加减法总结 乘法高精度 两个正整数相乘 两个正小数相乘 乘法总结 加法高精度 题目来源洛谷&#xff1a;P1601 AB Problem&#xff08;高精&#x…

老物件线上3D回忆展拓宽了艺术作品的展示空间和时间-深圳华锐视点

在数字技术的浪潮下&#xff0c;3D线上画展为艺术家们开启了一个全新的展示与销售平台。这一创新形式不仅拓宽了艺术作品的展示空间&#xff0c;还为广大观众带来了前所未有的观赏体验。 3D线上画展制作以其独特的互动性&#xff0c;让艺术不再是单一的视觉享受。在这里&#x…

220V降5V芯片输出电压电流封装选型WT

220V降5V芯片输出电压电流封装选型WT 220V降5V恒压推荐&#xff1a;非隔离芯片选型及其应用方案 在考虑220V转低压应用方案时&#xff0c;以下非隔离芯片型号及其封装形式提供了不同的电压电流输出能力&#xff1a; 1. WT5101A&#xff08;SOT23-3封装&#xff09;适用于将2…

勒索防御第一关 亚信安全AE防毒墙全面升级 勒索检出率提升150%

亚信安全信舷AE高性能防毒墙完成能力升级&#xff0c;全面完善勒索边界“全生命周期”防御体系&#xff0c;筑造边界勒索防御第一关&#xff01; 勒索之殇&#xff0c;银狐当先 当前勒索病毒卷携着AI技术&#xff0c;融合“数字化”的运营模式&#xff0c;形成了肆虐全球的网…

SpringBoot使用RedisTemplate、StringRedisTemplate操作Redis

前言 RedisTemplate 是 Spring Boot 访问 Redis 的核心组件&#xff0c;底层通过 RedisConnectionFactory 对多种 Redis 驱动进行集成&#xff0c;上层通过 XXXOperations 提供丰富的 API &#xff0c;并结合 Spring4 基于泛型的 bean 注入&#xff0c;极大的提供了便利&#x…

【自学安全防御】二、防火墙NAT智能选路综合实验

任务要求&#xff1a; &#xff08;衔接上一个实验所以从第七点开始&#xff0c;但与上一个实验关系不大&#xff09; 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 8&#xff0c;分公司设备可以通过总…

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

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

connect by prior 递归查询

connect by prior 以公司组织架构举例&#xff0c;共四个层级&#xff0c;总公司&#xff0c;分公司&#xff0c;中心支公司&#xff0c;支公司 总公司level_code为1 下一层级的parent_id为上一层级的id&#xff0c;建立关联关系 SELECT id, name, LEVEL FROM org_info a STA…

海事无人机解决方案

海事巡察 海事巡察现状 巡查效率低下&#xff0c;存在视野盲区&#xff0c;耗时长&#xff0c;人力成本高。 海事的职能 统一管理水上交通安全和防治船舶污染。 管理通航秩序、通航环境。负责水域的划定和监督管理&#xff0c;维护水 上交通秩序&#xff1b;核定船舶靠泊安…

使用自制Qt工具配合mitmproxy进行网络调试

在软件开发和网络调试过程中&#xff0c;抓包工具是不可或缺的。传统的抓包工具如Fiddler或Charles Proxy通常需要设置系统代理&#xff0c;这会抓到其他应用程序的网络连接&#xff0c;需要设置繁琐的过滤&#xff0c;导致不必要的干扰。为了解决这个问题&#xff0c;我们可以…

linux中关于环境变量的常用的设置方法

一. linux中设置环境变量的方式 1.使用/etc/environment, 是一个全局的环境变量设置文件&#xff0c;它会影响到所有用户和所有进程。当你需要设置一个全局的环境变量时&#xff0c;应该使用这个文件。这个文件的格式是 KEYvalue&#xff0c;每行一个环境变量。 2. 使用/etc/…

【unity笔记】常见问题收集

一 . Unity Build GI data 卡住问题 解决: 参考官方文档&#xff0c;GI(Global Illumination) data 指的是全局照明信息。 在Unity的Edit->Preference中&#xff0c;可以编辑GI缓存路径和分配GI缓存大小。 调出Window->Rendering->Lighting窗口&#xff0c;取消勾选…

【Caffeine】⭐️SpringBoot 项目整合 Caffeine 实现本地缓存

目录 &#x1f378;前言 &#x1f37b;一、Caffeine &#x1f37a;二、项目实践 2.1 环境准备 2.2 项目搭建 2.3 接口测试 ​&#x1f49e;️三、章末 &#x1f378;前言 小伙伴们大家好&#xff0c;缓存是提升系统性能的一个不可或缺的工具&#xff0c;通过缓存可以避免大…

基于SpringBoot+VueJS+微信小程序技术的图书森林共享小程序设计与实现:7000字论文+源代码参考

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…