【问题标题】:Use OpenSSL in Qt C++在 Qt C++ 中使用 OpenSSL
【发布时间】:2017-01-21 16:28:20
【问题描述】:

我有一个示例项目,它使用 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文件中添加其导入库,还需要在运行项目时确保其在路径中!
  • 我删除了INCLUDEPATH 并将LIBS 保留在.pro 文件中。在%PATH% 中添加了OpenSSL 的bin 目录。即使我编译了 OpenSSL 1.1.0QSslSocket::supportsSsl() 仍然返回 false 并且 QSslSocket::sslLibraryVersionString() 返回 OpenSSL 1.0.2g 1 Mar 2016
  • qDebug() << qgetenv("PATH"); 添加到 main() 并确保您的库路径出现在那里并且它是正确的。将调试输出中的库路径复制粘贴到资源管理器窗口并确保其有效。
  • 它有 C:\\OpenSSL-Win32\\lib 但它无效。最近我在C:\openssl_1.1.0 中删除了所有内容并从头开始构建 OpenSSL。我怎样才能改变它?我找不到它的设置。

标签: c++ qt ssl openssl


【解决方案1】:

来自文档:

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

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

您想检查QSslSocket::sslLibraryVersionNumber() - [...] 在运行时使用的库的版本(强调我的)。

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

【讨论】:

  • 好的,所以我应该提供 OpenSSL 1.0.2g DLL 并将它们放入 PATH 以使我的应用程序正常工作。你能告诉我我的应用程序需要的确切 DLL 是什么吗?
  • 您不要将“dll”放入PATH,而是添加 OpenSSL 安装前缀的bin 子文件夹 @987654328 @。因此,假设您构建了 OpenSSL 1.0.2h(您可以获得最新 1.0.2 - 所有 1.0.2 都是二进制兼容的),并将前缀设置为 C:\OpenSSL。然后,将C:\OpenSSL\bin 添加到PATHlibraryPaths
  • 问题是我将 32 位 libeay32.dllssleay32.dll 文件放在我的应用程序旁边。当我安装 Win64-OpenSSL 并在我的应用程序旁边复制提到的 DLL 时,它起作用了。谢谢。
猜你喜欢
  • 2014-01-08
  • 2015-12-09
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 2017-09-09
  • 1970-01-01
相关资源
最近更新 更多