Qt开发中TLS初始化失败问题的解决方案
Qt开发中TLS初始化失败问题的解决方案
在使用Qt进行HTTPS请求开发时,经常会遇到"TLS initialization failed"的错误。本文将详细介绍这个问题的原因,并提供一个适用于Windows系统的解决方案,帮助开发者快速解决这一困扰。
问题描述
最近在使用HTTPS给服务器发送请求时,遇到了"qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed"错误。经过一番排查,发现是由于缺少openssl库支持导致的。
原因分析
使用Qt的network模块时,如果需要使用HTTPS,就会用到openssl库,需要使用SSL/TLS加密方式。如果缺少对应的库,就会报"qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed"错误。
解决方案
第一步:下载openssl
下载链接:https://slproweb.com/products/Win32OpenSSL.html
进入下载页面后,不要盲目选择高版本!Qt本身是支持ssl的,但是因为法律原因?没有自带对应的dll。
我们先使用这段代码打印当前Qt支持的ssl版本:
#include <QSslSocket>
#include <QDebug>
qDebug()<< QSslSocket::sslLibraryBuildVersionString();
使用网络需要加上Qt的网络模块,在pro文件里加上:
QT += network
我这里输出的是1.1.1,这就是你的Qt使用的openssl的版本,在下载页面找到对应的版本,选择你的应用程序的对应位数下载、安装。
第二步:安装openssl
安装的时候,我选择的是第二个,这样可以方便的进行dll文件的拷贝。
第三步:拷贝库文件
安装完成后在openssl的路径下找到bin目录,拷贝这两个库到你的应用程序执行路径下(或者拷贝到Qt的对应编译路径下,例如msvc2017/bin/,这样之后你所有的Qt类似工程都可以使用SSL/TLS,但是编译打包的时候记得带着这俩库):
拷贝libcrypto-1_1-x64.dll、libssl-1_1-x64.dll文件到工程的exe程序所在路径下。
拷贝完后重新运行程序,至此就可以成功解决"TLS initialization failed"的问题了。
参考资料
下载openssl项目源码:https://blog.51cto.com/fish/5935049