【发布时间】: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() << "SslLibraryBuildVersion: " << QSslSocket::sslLibraryBuildVersionString();然后你应该安装最接近的版本并将libeay32.dll, libssl32.dll and ssleay32.dll放在你的 *.exe 旁边 -
是的,这是我在@Alienpenguin 回答后的想法,但我没有时间去做。完成后我会回来的。