在Qt C++中使用OpenSSL

Mus*_*lik 4 c++ ssl qt openssl

我有一个示例项目,它使用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
Run Code Online (Sandbox Code Playgroud)

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

INCLUDEPATH += . "C:/OpenSSL-Win32/include/" LIBS +=
-L"C:/OpenSSL-Win32/lib/" -llibcrypto -llibssl
Run Code Online (Sandbox Code Playgroud)

但仍然是同样的错误.我下载了OpenSSL安装程序,但仍然如此.

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

我知道我错过了一个简单的细节.请告诉我它是什么.谢谢.

Rei*_*ica 9

从文档:

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

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

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

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