添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

通用写法及问题描述

通讯软件在自己电脑上可运行,但是在客户电脑上就无法正常运行。总是显示连接不上,日志打印后,会出现“QSslSocket::connectToHostEncrypted: TLS initialization failed”的报错。代码通用部分写法精简如下:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
	QNetworkAccessManager* pManager = new QNetworkAccessManager(this);
	QNetworkRequest request;
	QUrl url = ui->lineIPServer->text();
	request.setUrl(QUrl(url));
	request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json; charset=utf-8");
	QString jsonToSever = "xxxxxx";
	QString strSendToSercer = QString("{\"dataList\": %1}").arg(jsonToSever);
	QByteArray bytePost = strSendToSercer.toUtf8();
	QNetworkReply *pReply = pManager->post(request, bytePost);
	connect(pReply, &QNetworkReply::finished, this, &MainWindow::onFinished);
void MainWindow::onFinished()
    qDebug() << "server return";
    QNetworkReply *pReply = qobject_cast<QNetworkReply*>(sender());
    // <1>判断有没有错误
    if (pReply->error()){
        //输出错误码及错误信息
        qDebug()<< pReply->errorString();
        ui->txtSended->append(QStringLiteral("服务器无返回数据,正尝试重新上传。。。"));
        pReply->deleteLater();
        pReply = nullptr;
        return;
    // <2>检测状态码
    int statusCode  = pReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    qDebug() << "statusCode:" << statusCode;
    // <3>状态码正常,服务器成功响应本次请求
    if (statusCode >= 200 && statusCode <300){
        //读取返回的数据并刷新显示
        QByteArray replyContent = pReply->readAll();
        QTextCodec *codec = QTextCodec::codecForName("utf8");
        QString all = codec->toUnicode(replyContent);
        qDebug() << all;
        ui->txtSended->append(all);
        // 数据读取完成之后,清除reply
        pReply->deleteLater();
        pReply = nullptr;

原因分析:

之前biying搜了一下,大多数是在打包后的程序里放入D:\QT\Tools\mingw810_64\opt\bin目录下的两个动态库ssleay32.dll和libeay32.dll,解决了问题。但是我试了却怎么也行不通。本人使用的QT版本为5.15.2。

解决方案:

后来在QT的Tools目录下发现了OpenSSL文件夹。
在这里插入图片描述
点进去将其中的libcrypto-1_1-x64.dll和libssl-1_1-x64.dll,放在exe根目录下运行,就可以正常接收服务器返回数据。搞定!
在这里插入图片描述

个人猜想,可能是因为本人采用的编译器是msvc2019。再加上QT版本较新,原先的ssleay32.dll和libeay32.dll已经不再适用了。

QT的HTTPS写法参考链接链接: https://zhuanlan.zhihu.com/p/349171758

关于QT实现HTTPS通信(MSVC编译器),并解决QSslSocket::connectToHostEncrypted: TLS initialization failed的报错 根据客户需求,写了一个小的通讯软件,用于与上游服务器通讯。采用的是Https协议。通讯软件在自己电脑上可运行,但是在客户电脑上就无法正常运行。总是显示连接不上,日志打印后,会出现“QSslSocket::connectToHostEncrypted: TLS initialization failed”的报错。代码通用部分写法精简如下:原因分析:之前biying搜了一下,大多数是在打包后的程序里放入D:\QT\Tools\mingw810_64\opt\bin目录下的两个动态库ssleay32.dll QSslSocket类为客户端和服务器提供SSL加密的套接字。 QSslSocket建立了安全的加密TCP连接,可用于传输加密的数据。它可以在客户端和服务器模式下运行,并且支持现代SSL协议,包括SSL 3和TLS 1.2。默认情况下,QSslSocket仅使用被认为是安全的SSL协议(QSsl :: SecureProtocols),但是只要在握手开始之前调用setProtocol(),就可以通过调用setProtocol()来更改SSL协议。 套接字进入ConnectedState之后,SSL Qt 使用QNetwork 模块,进行api请求时发生错误,错误信息:qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed 当你用HTTP形式的时候,会发现没有问题,而使用HTTPS时,则会报错。如果对计算机网络有所了解的人,应该大致懂原因。 因为HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 在使用Qt发送HTTP请求中一般使用的链接都是http://前缀,而有的服务器支持 https://前缀的链接,而Qt本身是支持https的,但是https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在Qt中使用https需要进行SSL认证。 1、pro文件最上方加以下扩展 QT += network 2、添加头文件 #include <QNetworkReply> #include <QDebug> #include <QString> QNetworkAccessManager *manager = new QNetworkAccessManager(this); qDebug() &lt;&lt; manager-&gt;supportedSchemes(); 返回的结果: (“ftp”, “file”, “qrc”, “h...
网上有关于这方面的很多说明,大多只是说明缺少https所依赖的两个库:libeay32.dll和ssleay32.dll。但是还是需要具体情况具体分析,因为openssl的这两个库属于开源性质的,有不少不同的版本,比如QT用的版本和其它软件用的版本就可能不同,不同版本的库交叉使用同样可能存在问题; 问题:在开发机上使用https没有任何问题,但是在干净的虚拟机上发现,即使libeay32.dll...
Qt Https通信TLS initialization failed 解决方法 Window端使用Qt 做开发请求Https资源时,会经常遇到 TLS initialization failed,分析原因是,在Qt中并未包含 SSL所包含的库,因此需要开发者,自己将库拷贝到 构建目录。 注意: 这个解决方案,也要区分Qt的版本号。 QT5.12 下载Win64OpenSSL 并点击安装,在所安装的目录下,拷贝 libea32.dll 和 ssleay32.dll 库到\Qt\Qt5.12.0\5.
闲来没事,再来一篇博文,讲讲我最近做的QT实现的Webdav通信HTTPS实现。 HTTP太不安全了,抓包随便就可以拿到报文,但是Webdav有不能通过QT自带的authenticationRequired进行用户名和密码的验证,只好自己拼接报文头, 本项目就是介绍如何用HTTPS进行Webdav通信。 authenticationRequired就是相当于我们访问一个ftp,ftp需要用户输入用户名和密码,authenticationRequired就是让用户输入 如果url是http的话,authent
解决qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed
超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。 HTTPS(Hyper Text Transfer Protocol over SecureSocket Layer)的介绍: 以安全为目标的 HTTP ... CSDN-Ada助手: 恭喜您写了这篇有趣的博客,探讨了Linux中“unrar x test.rar”和“unrar e test.rar”命令的区别。我认为您的文章非常有用,对于使用Linux的用户来说,这些命令的差异可能非常重要。接下来,我建议您可以探讨更多关于Linux的主题,如命令行的其他工具、安全性问题或者是更高级的主题。期待您的下一篇文章! CSDN 会根据你创作的博客的质量,给予优秀的博主博客红包奖励。请关注 https://bbs.csdn.net/forums/csdnnews?typeId=116148&utm_source=csdn_ai_ada_blog_reply9 看奖励名单。 C++坐标旋转,两种方式总结 CSDN-Ada助手: 非常棒的博客!C++坐标旋转确实是一个非常重要的话题,我很期待你能够继续深入探究这个主题。我想推荐你写一篇关于如何用C++实现三维坐标系旋转的技术文章,包括欧拉角、四元数、旋转矩阵等多种方法的实现原理和代码示例。这将会是一篇非常有价值的技术博文,期待你的下一篇文章! 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。 关于实现QT进度条的显示值动态连续增加的方法 elais_h: 博主,那个进度条已经走完的部分,有个动画效果,从左到右亮了一下,那个怎么设置,我在运行的时候看不到,只在qt的ui界面面看到过 关于实现QT进度条的显示值动态连续增加的方法 欣雨秋尘: 上面有gif图能看出来。普通的是一跳一跳的增长,自定义的是连续增长。其实是我强迫症,想让进度条的增长看着好看,哈哈。 关于实现QT进度条的显示值动态连续增加的方法 买的挂什么时候到账: 博主,其实我没有看出这普通进度显示和自定义动态显示的区别在哪里,能详细说明一下吗。