在Qt C++中使用OpenSSL

7

我拿到一个使用QSslSocketQSslCertificate从SSL证书获取信息的示例项目(Qt 5.7,Windows 10)。QSslSocket::supportsSsl()函数返回false,并且在运行时出现以下错误:

qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error

所以我编译了OpenSSL_1.1.0并将其链接到我的项目中:

INCLUDEPATH += . "C:/OpenSSL-Win32/include/" LIBS +=
-L"C:/OpenSSL-Win32/lib/" -llibcrypto -llibssl

但是仍然出现相同的错误。我已经下载了OpenSSL安装程序,但问题依旧存在。

奇怪的是QSslSocket::sslLibraryBuildVersionString()返回的是OpenSSL 1.0.2g 1 Mar 2016,尽管我编译并安装了OpenSSL_1.1.0。

我知道我缺少一个简单的细节。请告诉我这是什么。谢谢。


当然,INCLUDEPATH 是不必要的,因为你并不直接使用 openssl 编译任何代码。你只需要 LIBS += ... 这一行就可以了。如果 openssl 被编译为动态链接库,你不仅需要在 .pro 文件中添加它的导入库,还需要确保在运行项目时它在路径中! - Kuba hasn't forgotten Monica
我在.pro文件中删除了INCLUDEPATH并保留了LIBS。将OpenSSL的bin目录添加到%PATH%中。仍然无法通过QSslSocket::supportsSsl()返回true,而且QSslSocket::sslLibraryVersionString()返回的是OpenSSL 1.0.2g 1 Mar 2016,尽管我已经编译了OpenSSL 1.1.0。 - Mustafa Chelik
main() 中添加 qDebug() << qgetenv("PATH");,确保您的库路径出现在其中并且是正确的。将库路径从调试输出中复制粘贴到资源管理器窗口中,并确保它是有效的。 - Kuba hasn't forgotten Monica
它有C:\\OpenSSL-Win32\\lib,但是无效。最近我删除了所有内容,并从头开始在C:\openssl_1.1.0中构建了OpenSSL。我该如何更改它?我找不到它的设置。 - Mustafa Chelik
@KubaOber,我当然知道如何在Windows中设置环境变量,但C:\OpenSSL-Win32\lib不在%PATH%中。我不知道Qt从哪里获得它!我删除了所有内容,因为OpenSSL_1.1.0与Qt不兼容。我编译了Qt使用的OpenSSL_1.0.2g。无论如何,遗憾的是我仍然得到相同的错误。感谢您的回复,Kuba。 - Mustafa Chelik
显示剩余7条评论
1个回答

10

从文档中可以看到:

QSslSocket::sslLibraryBuildVersionString() 返回SSL库编译时使用的版本字符串(重点在我)。

这并不意味着Qt有访问OpenSSL,只是编译针对特定版本。这让您知道在运行时应提供哪个二进制兼容版本,如果它是动态链接的(默认情况下是这样)。

你应该检查QSslSocket::sslLibraryVersionNumber() - [...] 库运行时使用的版本号(重点在我)。

Qt可能会尝试在PATH中找到OpenSSL dlls的副本,如果没有,在由QCoreApplication::libraryPaths给出的路径中查找。 在尝试使用OpenSSL之前,您应该将OpenSSL dlls的位置添加到其中任意一个。


好的,所以我应该提供OpenSSL 1.0.2g DLL并将它们放在“PATH”中以使我的应用程序正常工作。你能告诉我我的应用程序需要哪些确切的DLL吗? - Mustafa Chelik
你不需要将“dlls”放在PATH中,而是 OpenSSL 安装前缀的 bin 子文件夹 添加到 PATH 中。假设你构建了 OpenSSL 1.0.2h(最新版本 1.0.2 - 所有 1.0.2 版本都是二进制兼容的),并将前缀设置为 C:\OpenSSL。然后,将 C:\OpenSSL\bin 添加到 PATHlibraryPaths 中。 - Kuba hasn't forgotten Monica
1
问题在于我将32位的libeay32.dllssleay32.dll文件放在了我的应用程序旁边。当我安装了Win64-OpenSSL并将提到的DLL文件复制到我的应用程序旁边时,它就可以工作了。谢谢。 - Mustafa Chelik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接