我编写了一个在 Linux mint 18.3 版上运行的 C++ Qt 应用程序(QtCreator 4.8 版,基于 Qt 5.12.0),它使用了 QNetworkAccessManager 和相关类。它基本上是一个与 Betfair 服务器通信的 Betfair HTTPS 客户端应用程序。我安装了 openSSL(版本 1.0.2g)。
基本上我的应用程序运行良好,但我在 QtCreator 的应用程序输出选项卡上得到了 qt.network.ssl: QSslSocket: cannot resolve SSLv2_server_method (两次)。我能够成功登录并与 API 交互 - 一切看起来和行为都很好!我什至使用 wireshark 来检查看起来肯定被加密的数据包。
我在这里和网上看到其他答案说 Ubuntu 发布 openSSL 时由于不稳定而禁用了 openSSLv2,并建议在启用 openSSLv2 的情况下重新编译。但由于我的应用程序实际上正在运行,我不确定这是否有必要?
基本上我的问题是这个警告对我的软件(看起来完全按预期工作)在安全方面有什么影响?我真的不想在不知道它的用途的情况下忽略警告。我只知道 SSL 工作原理的基础知识,所以我不太了解如何在此处继续操作。
编辑:一些答案让我发现警告是在从我的 key 文件创建 QSslKey 时触发的。导致它的实际代码是:
QByteArray keydata = kfile.readAll();
QSslKey pkey(keydata,QSsl::Rsa); // Warning fires after this line executed
if(pkey.isNull()) {
qWarning("The key has no content.");
}
最佳答案
恐怕我不能给你一个完整的答案,但我可以给你一些 Material 来调查。
在您的 Qt 安装文件夹中检查文件 qtnetwork-config.h 它包含的标志将启用/禁用代码 Qt 代码,具体取决于您在配置 Qt(使用/qtsrc/configure)或在您的系统上构建时可用的平台包。
我的 qtnetwork-config.h 文件示例:
#define QT_FEATURE_networkinterface 1
#define QT_FEATURE_bearermanagement 1
#define QT_FEATURE_ftp 1
#define QT_FEATURE_http 1
#define QT_FEATURE_localserver 1
#define QT_FEATURE_networkdiskcache 1
#define QT_FEATURE_networkproxy 1
#define QT_NO_OPENSSL true
#define QT_FEATURE_sctp -1
#define QT_NO_SCTP
#define QT_FEATURE_socks5 1
#define QT_FEATURE_ssl -1
#define QT_NO_SSL
#define QT_FEATURE_udpsocket 1
如果您的 ssl 包在您构建 Qt 后发生了变化(例如,您升级/降级或删除了一些......)这些设置是否仍然有效?我不确定。部署预构建 Qt 时会发生什么? ...
这可以进一步调查。 无论如何,要找出导致警告的原因,请安装消息处理程序:
// put this in main.cpp for instance
void myMessageOutput(QtMsgType type, const QMessageLogContext &/*context*/, const QString &msg)
{
if (msg.contains("cannot resolve SSLv2_server_method"))
{
qDebug() << "put a breakpoint here and look in the stack trace where you are";
}
}
// put this in int main(int argc, char ** argv) for instance
qInstallMessageHandler(myMessageOutput);
使用 Qt build in debug from source 在调试中运行您的应用程序。 您应该在消息处理程序中命中断点并查看消息的来源。
关于C++ Qt 应用程序工作但给出警告 "qt.network.ssl: QSslSocket: cannot resolve SSLv2_server_method",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54169577/