记录使用Qt的http示例代码时出现的:qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed

本文讲述了在Qt项目中遇到的http请求SSL初始化失败问题,通过检查openssl版本并添加对应库解决,包括手动编译源码和使用预编译库的过程。

引言

本文主要记录在阅读和运行Qt的示例代码http时,运行时不能正常运行的问题。

问题描述

示例代码打开后,编译,运行程序启动后正常出现界面:
在这里插入图片描述
啥也不做,点击Download按钮之后,控制台应用程序输出:
qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed
是缺少对应的openssl库。

解决方法

查看openssl版本

查询自己当前的环境下需要的对应版本的openssl库,可以使用下面的代码:

qDebug()<<"version:"<<QSslSocket::sslLibraryBuildVersionString();

在项目中添加上述代码,编译运行程序,查看控制台输出。我使用的是windowns下Qt5.15.2 msvc2019_64bit,控制台输出对应的openssl的版本:

version: "OpenSSL 1.1.1g  21 Apr 2020"

生成使用openssl库

下载对应版本的openssl库来用,发现官网上没有提供openssl1.1.1g对应的库,只可以找到对应版本的源码。下载OpenSSL 1.1.1g的源码到本地,想自己编译生成动态库的可以看文章末尾的参考文章。
如果嫌弃麻烦,不想自己编译,那么文章开头提供的编译生成的动态库,可以直接下载之后使用。
我就是参考这篇文章与上面的那篇文章,使http项目可以正常运行。

使用

将生成的库libcrypto-1_1-x64.dll和libssl-1_1-x64.dl
在这里插入图片描述
拷贝到应用程序的执行目录下,
在这里插入图片描述
同时再拷贝到Qt安装目录下的对应的编译器所在bin目录下。
在这里插入图片描述
再去编译运行项目http就可以正常下载了。
在这里插入图片描述

注意

若是自己编译源码来生成动态库,按照本文末尾的参考文章所提供的生成对应平台的动态库编译过程中,若是执行过程中出现一些错误,也可以试图继续按步骤向下执行,最后去源码所在的目录下查找是否生成了动态库。
在这里插入图片描述
我按照上面的文章OpenSSL动态链接库源码安装编译过程中虽出现错误(在执行namke test时报错,但我还是继续执行nmake install,虽然依旧报错),但是最后还是生成了动态库,也可正常使用。

参考文章

下载和使用openssl库
OpenSSL动态链接库源码安装

<think>我们正在处理用户关于Qt网络请求中TLS初始化失败的问题。根据引用内容,问题通常与QtOpenSSL支持有关。我们将逐步分析并提供解决方案。步骤1:确认问题现象错误信息:qt.network.ssl:QSslSocket::connectToHostEncrypted: TLSinitialization failed这个错误表明在尝试建立加密连接TLS初始化失败。步骤2:理解原因根据引用[2],这个错误通常是因为Qt无法加载所需的OpenSSL库。可能的原因包括:1.Qt编译没有启用OpenSSL支持(但通常官方发布的版本是支持的)。2.运行缺少必要的OpenSSL动态链接库(DLL)。3. OpenSSL库版本不匹配。步骤3:诊断方法引用[2]提供了两个有用的调试信息:1.打印Qt编译使用OpenSSL版本:`qDebug()<< QSslSocket::sslLibraryBuildVersionString();`2.检查当前运行是否支持OpenSSL:`qDebug()<< QSslSocket::supportsSsl();`如果第二个调用返回false,则说明运行没有正确加载OpenSSL库。步骤4:解决方案根据引用[3],一个常见的解决方案是将OpenSSL的两个DLL文件(libssl-1_1-x64.dll和libcrypto-1_1-x64.dll)复制到可执行文件(exe)的同一目录下。注意:需要匹配你的Qt版本和架构(32位或64位)。例如,对于64位程序,需要64位的DLL。其他可能的解决方案:1.设置环境变量:将包含OpenSSLDLL的目录添加到PATH环境变量中。2.确保使用正确的OpenSSL版本:Qt5.12及以后通常需要OpenSSL1.1.x版本(注意:Qt5.15开始支持OpenSSL1.1.1Qt6则要求OpenSSL1.1.1或更高)。3.如果使用自编译的Qt,请确保在编译配置了OpenSSL支持。步骤5:验证解决运行程序,再次检查错误是否消失。同,可以通过`QSslSocket::supportsSsl()`来验证OpenSSL是否被正确加载。示例代码(在main函数中): ```cpp#include <QSslSocket>#include <QDebug> intmain(intargc,char *argv[]){// ...其他代码qDebug() <<"OpenSSL buildversion:"<< QSslSocket::sslLibraryBuildVersionString();qDebug()<< "OpenSSLsupport:"<< QSslSocket::supportsSsl();//...其他代码} ```如果输出显示支持OpenSSL,则问题可能已解决。注意:如果问题仍然存在,请检查以下事项:-确保DLL文件与应用程序的架构匹配(都是32位或都是64位)。-确保DLL文件没有损坏,且版本兼容(建议使用Qt构建相同版本的OpenSSL)。-如果使用Windows,注意系统目录中可能存在的旧版本OpenSSL干扰。根据引用[1][2][3],用户提供的解决方案集中在缺失DLL文件上,因此优先尝试复制DLL文件。总结解决方案:1.获取正确的OpenSSLDLL(libssl-1_1-x64.dll和libcrypto-1_1-x64.dll)[注意:32位程序需要libssl-1_1.dll和libcrypto-1_1.dll,不带x64]。2.将这些DLL文件放在可执行文件(.exe)所在的目录。3.运行程序,检查错误是否消失。如何获取DLL文件?-可以从OpenSSL官方网站下载预编译的二进制文件(例如,对于Windows,可以从https://slproweb.com/products/Win32OpenSSL.html下载)。-注意选择与你的程序架构(32位或64位)和Qt版本兼容的OpenSSL版本(推荐1.1.x)。如果问题仍然存在,可能需要重新安装Qt或检查Qt的安装包是否完整(特别是SSL模块)。附加说明:从Qt5.15开始,Qt还提供了另一种后端(Schannel)用于Windows上的SSL,因此可以尝试避免使用OpenSSL。通过设置:```cppQCoreApplication::setAttribute(Qt::AA_UseSchannel);//在main函数中,创建QCoreApplication/QApplication之前```这样Qt使用Windows自带的Schannel(安全通道)而不是OpenSSL,从而避免OpenSSL依赖问题。但注意:Schannel仅支持Windows平台,且需要Windows7或更高版本。因此,解决方案有两种途径:途径一:修复OpenSSL依赖(通用解决方案,跨平台)途径二:切换到Schannel(仅Windows,无需额外DLL)用户可以根据自己的平台和需求选择。最后,请用户根据实际情况尝试上述方法。</think>### Qt网络请求中TLS初始化失败的解决方案 当出现 `qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed` 错误,表明Qt无法初始化SSL/TLS加密连接。以下是根本原因分析和完整解决方案: --- #### **问题原因分析** 1. **OpenSSL库缺失**(最常见原因) 运行缺少关键DLL文件:`libssl-1_1-x64.dll` 和 `libcrypto-1_1-x64.dll`(64位程序)或对应的32位版本[^3]。 2. **Qt未启用OpenSSL支持** 编译未包含OpenSSL模块或配置错误,导致 `QSslSocket::supportsSsl()` 返回 `false`[^2]。 3. **版本不匹配** - Qt构建使用OpenSSL版本与运行版本不一致 - 操作系统缺少必要的SSL/TLS库(如Windows未安装CA证书) --- #### **完整解决方案** ##### ✅ 方案1:添加缺失的OpenSSL库(推荐优先尝试) 1. **获取DLL文件**: - 从官方下载OpenSSL预编译库: [Windows版下载地址](https://slproweb.com/products/Win32OpenSSL.html)(选择与程序架构匹配的版本) - 或从Qt安装目录查找:`<Qt安装路径>/Tools/OpenSSL/Win_x64/bin` 2. **放置DLL到正确位置**: ```plaintext # 将以下文件复制到可执行文件(.exe)同级目录: libcrypto-1_1-x64.dll // 64位程序 libssl-1_1-x64.dll // 64位程序 # 32位程序使用: libcrypto-1_1.dll libssl-1_1.dll ``` > 验证:启动程序后错误应消失[^3]。 ##### ✅ 方案2:验证QtOpenSSL支持 在代码中插入诊断信息: ```cpp #include <QSslSocket> // 在main函数中添加: qDebug() << "Build-time SSL version:" << QSslSocket::sslLibraryBuildVersionString(); qDebug() << "Runtime SSL support:" << QSslSocket::supportsSsl(); ``` - 若输出 `Runtime SSL support: false`,说明Qt未正确加载OpenSSL[^2]。 - 解决方案: - 重新安装Qt并勾选OpenSSL组件 - 设置环境变量指向OpenSSL库: ```cpp qputenv("QT_SSL_USE_OPENSSL", "1"); qputenv("OPENSSL_CONF", "C:/OpenSSL/openssl.cnf"); // 替换为实际路径 ``` ##### ✅ 方案3:Windows平台专用替代方案 使用Windows原生Schannel代替OpenSSLQt 5.15+): ```cpp #include <QCoreApplication> int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_UseSchannel); // ← 关键设置 QApplication app(argc, argv); // ...后续代码 } ``` > 此方法无需OpenSSL库,但仅限Windows平台[^1]。 ##### ✅ 方案4:证书配置 检查CA证书是否缺失: ```cpp QSslConfiguration sslConfig = QSslConfiguration::defaultConfiguration(); sslConfig.setCaCertificates(QSslCertificate::fromPath("C:/certs/cacert.pem")); // 指定证书路径 QSslConfiguration::setDefaultConfiguration(sslConfig); ``` > 证书下载:[curl CA证书](https://curl.se/docs/caextract.html) --- #### **验证步骤** 1.OpenSSL DLL放入exe目录 2. 运行诊断代码确认 `supportsSsl()` 返回 `true` 3. 测试HTTPS请求: ```cpp QNetworkAccessManager manager; QNetworkReply *reply = manager.get(QNetworkRequest(QUrl("https://www.qt.io"))); QObject::connect(reply, &QNetworkReply::finished, [&](){ qDebug() << "Request succeeded:" << (reply->error() == QNetworkReply::NoError); }); ``` --- #### **预防措施** 1. **发布程序** 通过windeployqt自动打包依赖: ```bash windeployqt --openssl myapp.exe ``` 2. **跨平台建议** - Linux:安装 `openssl-dev` 包 - macOS:使用Homebrew安装OpenSSL并设置链接: ```bash brew install openssl ln -s /usr/local/opt/openssl/lib/libssl.dylib /usr/local/lib/ ``` > 通过上述步骤,90%以上的TLS初始化问题可解决。若问题仍存在,建议检查防火墙/代理设置或更新Qt版本[^1][^2][^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肩上风骋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值