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

news2024/9/25 16:12:03

前言

在现代应用程序中,安全地传输数据变得越来越重要。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.coloradmin.cn/o/1923858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

要注意!Google账号提示活动异常就要注意了,很可能下一步就是真•停用

很多朋友&#xff0c;在主动或被动登录谷歌账号时&#xff0c;被提醒账号活动异常&#xff0c;要验证手机号才能进一步使用谷歌账号&#xff0c;这是什么原因呢&#xff1f;如果不及时验证会出现什么状况呢&#xff0c;该如何解决这个问题呢&#xff1f;如果验证提示手机无法用…

一篇文章教你掌握——Pytorch深度学习实践基础

一篇文章教你掌握——Pytorch深度学习实践 1. Overview 概述1.1 Rule-based systems 基于规则的系统1.2 Classic machine learning 经典机器学习1.3 Representation learning 表征学习1.4 Brief history of neural networks 神经网络简史 2. 配置环境2.1 安装Anaconda2.2 创建虚…

[stm32f407]定时器使用

1.定时器定时串口打印 main.c #include "stm32f4xx.h" // Device header #include "serial.h" #include "delay.h" #include "tim.h"extern uint16_t count;int main(void) {Serial_Init();TIM_Init();printf(&quo…

通过AIGC赋能创意设计发展

随着人工智能技术的飞速发展&#xff0c;AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;正逐渐成为创意设计领域的新引擎。AIGC通过智能算法与大数据的深度融合&#xff0c;不仅为设计师们提供了前所未有的创意灵感&#xff0c;还在设计方案优化等方面…

云计算数据中心(一)

目录 一、云数据中心的特征二、云数据中心网络部署&#xff08;一&#xff09;改进型树结构&#xff08;二&#xff09;递归层次结构&#xff08;三&#xff09;光交换网络&#xff08;四&#xff09;无线数据中心网络&#xff08;五&#xff09;软件定义网络 一、云数据中心的…

光明乳业首推公益主题数字资产,用爱助力青少年健康成长

作为一直秉持“温暖如一”的企业价值观的百年乳企&#xff0c;光明乳业始终关注青少年儿童的健康成长&#xff0c;积极投身公益活动&#xff0c;用爱心和行动温暖他们的世界。 今年六月&#xff0c;适逢儿童节与全国爱眼日&#xff0c;光明乳业先后参与“童心筑爱 品牌赋能”公…

神经网络 | Transformer 基本原理

目录 1 为什么使用 Transformer&#xff1f;2 Attention 注意力机制2.1 什么是 Q、K、V 矩阵&#xff1f;2.2 Attention Value 计算流程2.3 Self-Attention 自注意力机制2.3 Multi-Head Attention 多头注意力机制 3 Transformer 模型架构3.1 Positional Encoding 位置编…

晏子春秋-读书笔记二

“橘生淮南则为橘&#xff0c;生于淮北则为枳&#xff0c;叶徒相似&#xff0c;其实味不同。所以然者何&#xff1f;水土异也。今民生长于齐不盗&#xff0c;入楚则盗&#xff0c;得无楚之水土使民善盗耶&#xff1f;” 这段话的大意是说&#xff0c;橘树生长在淮河以南就是甜美…

【触摸屏】【地震知识宣传系统】功能模块:视频 + 知识问答

项目背景 鉴于地震知识的普及对于提升公众防灾减灾意识的重要性&#xff0c;客户希望开发一套互动性强、易于理解的地震学习系统&#xff0c;面向公众、学生及专业人员进行地震知识教育与应急技能培训。 产品功能 系统风格&#xff1a;严谨的设计风格和准确的信息呈现&#…

PointCloudLib ISS关键点提取 C++版本

测试效果 算法简介 PCL(Point Cloud Library)中的内部形状描述子(ISS,Intrinsic Shape Signatures)关键点提取是一种在3D点云中提取显著几何特征点的方法。这种方法非常适用于需要高质量点云配准、对象识别和分类等任务。以下是对PCL内部形状描述子(ISS)关键点提取的详…

企业国产操作系统选型适配实施方案

【摘要】企业在推动国产化进程时&#xff0c;需选择一款主流、稳定且安全的服务器操作系统作为其系统软件。在产品投入实际生产环境前&#xff0c;对上游软硬件的适配情况有深入了解至关重要。本文将重点介绍银河麒麟高级服务器操作系统V10&#xff08;以下简称麒麟V10&#xf…

深度学习中的FLOPs补充

学习了博主的介绍&#xff08;深度学习中的FLOPs介绍及计算(注意区分FLOPS)-CSDN博客&#xff09;后&#xff0c;对我不理解的内容做了一点补充。 链接放到下边啦 https://blog.csdn.net/qq_41834400/article/details/120283103 FLOPs&#xff1a;注意s小写&#xff0c;是floa…

AH3-3 10s AC220V时间继电器 面板安装 约瑟JOSEF

时间继电器 AH3-3 AH3-2 AH3-1 AH3系电子式时间继电器具有体积小、重量轻、延时精度高、延时范围宽、可靠性好、寿命长等特点&#xff0c;产品符合国际标准&#xff0c;最适合在各种高精度、高可靠性自动控制场合作延时控制之用. 型号&#xff1a;AH3-3 外型尺寸&#xff1a…

【Quart 框架——来源于Flask的强大且灵活的异步Web框架】

目录 前言一、Quart简介1-1、简介1-2、与flask的区别 二、快速开始2-1、安装2-2、基本用法 三、核心功能3-1、异步路由3-2、WebSockets 支持3-3、中间件3-4、蓝图 (Blueprints) 四、部署4-1、使用uvicorn部署4-2、使用hypercorn部署 五、案例分析总结 前言 Quart 是一个基于 Py…

​Chrome 插件: GoFullPage 一键搞定全网页截图

在互联网时代&#xff0c;网页截图已成为我们日常工作和生活中不可或缺的部分。无论是保存重要信息、制作教程&#xff0c;还是分享有趣的内容&#xff0c;截图功能都显得尤为重要。然而&#xff0c;常规的截图工具往往只能截取当前屏幕的内容&#xff0c;对于长网页则显得力不…

2024 辽宁省大学数学建模竞赛C 题 改性生物碳对水中洛克沙胂和砷离子的吸附 完整思路 代码结果分享(仅供学习)

目前全球水体砷污染问题严重&#xff0c;极大地危害了人类的健康。砷在水体中主要以砷离子[AS(V)]和洛克沙胂(ROX)两种形式存在。改性生物碳具有优秀的吸附性能&#xff0c;可用于砷污染的处理。改性生物碳表面的官能团可以通过静电吸引、配位作用或络合作用与 AS(V)和 ROX 结合…

离线下载linux mysql和mysql基本库

下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 选择数据库版本&#xff0c;系统&#xff0c;系统版本信息 下载需要的rpm包&#xff0c;传入服务器&#xff0c;使用yum install xxx.rpm安装即可 mysql-community下载地址 https://dev.mysql.com/downloads/my…

SpringCloud教程 | 第七篇: 使用Nacos管理服务

1、先开发了一个生产者&#xff0c;启动了一个服务&#xff0c; 代码参考&#xff1a;https://github.com/veminhe/nacos.git 2、然后复制了该生产者&#xff0c;改了一下端口&#xff0c;启动成了另外一个服务 3、然后开发了一个消费者&#xff0c;里面使用了feign调用生产者…

Windows安装mamba全流程(全网最稳定最成功)

windows系统下安装mamba会遇到各种各样的问题。博主试了好几天&#xff0c;把能踩的坑都踩了&#xff0c;总结出了在windows下安装mamba的一套方法&#xff0c;已经给实验室的windows服务器都装上了。只要跟着我的流程走下来&#xff0c;大概率不会出问题&#xff0c;如果遇到其…