C ++ Qt应用程序正常运行,但发出警告“ qt.network.ssl:QSslSocket:无法解析SSLv2_server_method”

时间:2019-01-13 13:56:32

标签: c++ ssl https qt5 qt-creator

我编写了一个C ++ Qt应用程序(基于Qt 5.12.0的QtCreator版本4.8),该应用程序在Linux Mint版本18.3上运行,该版本使用QNetworkAccessManager和相关类。它基本上是与Betfair服务器通信的Betfair HTTPS客户端应用程序。我已经安装了openSSL(版本1.0.2g)。

我的应用程序基本上可以正常运行,但是在QtCreator的应用程序输出选项卡上,得到了 qt.network.ssl:QSslSocket:无法解析SSLv2_server_method (两次)。我能够成功登录并与API交互-一切看起来和行为都很好!我什至用Wireshark来检查确实看起来是加密的数据包。

我在这里和网上都看到了其他答案,说Ubuntu由于不稳定而禁用了openSSLv2,并提供了启用openSSLv2的重新编译建议。但是由于我的应用程序实际上正在运行,所以不确定是否有必要?

基本上我的问题是,此警告对我的软件(似乎完全按照预期的方式工作)在安全方面有什么影响?我真的不想在不知道警告含义的情况下忽略警告。我只知道SSL工作原理的基础,因此我不懂如何进行此操作。

编辑:一些答案使我发现从我的密钥文件创建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.");
}

2 个答案:

答案 0 :(得分:0)

恐怕我不能给您完整的答案,但是我可以给您一些材料进行调查。

在Qt安装文件夹中,检查文件qtnetwork-config.h 它包含一些标志,这些标志将根据配置Qt时(使用/ qtsrc / configure)或在系统上构建时可用的平台程序包来启用/禁用代码Qt代码。

我的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

如果您在构建Qt之后更改了ssl软件包(例如,您已升级/降级或删除了某些内容...),这些设置仍然有效吗?我不确定部署预构建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从源代码进行调试来在调试中运行应用程序。 您应该在消息处理程序中点击断点,然后查看消息的来源。

答案 1 :(得分:0)

不推荐使用TLSv1.2的所有次要版本,例如TLSv1.0和SSLv1.0 SSLv2.0,不再应使用或不再支持。由于那里有很多服务器和客户端,它们没有指定对TLS版本的最低要求,因此Ubuntu禁用了这些真正古老且不安全的协议。您可以在这里了解更多信息:TLSv1.1 must die die die

根据所使用的QNetworkManager / Qt的版本,使用这样的语句可以使警告消失,并大大提高安全套接字加密的安全性。

QNetworkRequest request(url);
QSslConfiguration config = request.sslConfiguration();
config.setProtocol(QSsl::TlsV1_2);