【问题标题】:How to make QSslSocket support SSL using an OpenSSL installation?如何使用 OpenSSL 安装使 QSslSocket 支持 SSL?
【发布时间】:2019-05-05 14:12:21
【问题描述】:

我正在尝试运行一个简单的客户端/服务器来实现使用 QSslSocket 的通信。我在 Windows 上工作(不幸的是),我使用 QtCreator 来获得更多便利。

当我尝试从客户端使用 MyQSslSocket->connectToHostEncrypted(ip, port) 连接到服务器时,我收到以下消息:

qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS 初始化失败

当我打印引发的错误时,我得到以下错误:

QAbstractSocket::SocketError(20)

在文档中我们可以发现这个错误码对应QAbstractSocket::SslInternalError,其描述为:

“正在使用的 SSL 库报告了一个内部错误。这可能是库安装错误或配置错误的结果。”

经过一些调查,我发现 Qt 本身不提供 OpenSSL,所以我从这里 https://slproweb.com/products/Win32OpenSSL.html 安装了它(二进制文件,确保 32 位和 64 位版本)。
在安装过程中,dll 被复制到 C:\Windows\System32(对于 64 位)。然后我检查了PATH 环境变量确实包含这个文件夹。

此时我又试了一次,还是一样的问题,好像还是没有找到OpenSSL的安装。

当我打印以下调用的输出时(在我的客户端的主函数中):

qDebug() << QSslSocket::supportsSsl();
qDebug() << QSslSocket::sslLibraryVersionString();

我得到以下输出:


""

我的问题是,如何让 QSslSocket::supportsSsl() 返回 true ?

如果有人能告诉我我错过了什么,我做错了什么,并告诉我应该怎么做才能使这个 SSL 连接正常运行,我将非常感激。

法瑞诺。

PS:很抱歉这个问题太长了,但我认为清楚地揭示问题和上下文很重要,以帮助您轻松理解问题并给我更多相关的答案。

【问题讨论】:

  • 您使用的是什么版本的 Qt?以及您使用的是什么版本的 ssl? 1.0.x 还是 1.1.x? IIRC ssl 1.1.x 可能仅受最新的 Qt 版本支持。可能值得尝试使用 ssl 1.0.x
  • 哦,我不知道。我的 Qt 版本是 5.12.2,我的 OpenSSL 版本是 1.1.1b。我已经尽我所能。你认为我必须降级我的 OpenSSL 安装吗?如果可能的话,我宁愿避免这样做,因为我想在安全功能方面保持最新......
  • 我不是 SSL 专家,但就安全性而言,您应该使用最新的 1.0.2 补丁级别安全。请尝试下载 1.0 版本并将库放在二进制目录中。这应该足以测试它是否有效
  • @Fareanor 检查你的 Qt 包使用的 openSsl 的版本:qDebug() &lt;&lt; "SslLibraryBuildVersion: " &lt;&lt; QSslSocket::sslLibraryBuildVersionString(); 然后你应该安装最接近的版本并将libeay32.dll, libssl32.dll and ssleay32.dll 放在你的 *.exe 旁边
  • 是的,这是我在@Alienpenguin 回答后的想法,但我没有时间去做。完成后我会回来的。

标签: c++ windows qt openssl


【解决方案1】:

好的, 感谢@AlienPenguin 和@Macias 的建议,我的OpenSSL 版本太新了。

最后,我安装了用于 Qt 构建的最接近的可用版本(这确实有意义,我应该想到它),可以通过运行以下调用找到它:

qDebug() << QSslSocket::sslLibraryBuildVersionString();

问题解决了。

再次感谢。

【讨论】:

    猜你喜欢
    • 2016-04-18
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多