代码之家  ›  专栏  ›  技术社区  ›  mathematician1975

C++ QT应用程序工作,但给出警告“q.NETWorks.SSL:QSLStuts:不能解析SSLV2A.ServILL方法”

  •  2
  • mathematician1975  · 技术社区  · 6 年前

    我已经编写了一个C++ QT应用程序(QtC造作版本4.8,基于QT5.12.0),运行在Linux MINT版本18.3上,使用QNETWorkAccess Maungor和相关类。它基本上是一个与Betfair服务器通信的betfairhttps客户端应用程序。我已经安装了openSSL(版本1.0.2g)。

    qt.network.ssl:qslsocket:无法解析SSLv2\u服务器\u方法 (两次)在QtCreator的“应用程序输出”选项卡上。我能够成功地登录和互动的API-一切看起来和行为良好!我甚至用wireshark来检查那些看起来肯定是加密的数据包。

    我在这里和网上看到了其他的答案,说Ubuntu发布的openSSL由于不稳定而禁用了openSSLv2,并建议在启用openSSLv2的情况下重新编译。但由于我的应用程序正在运行,我不确定这是否必要?

    编辑: 一些答案让我发现,警告是在从我的密钥文件创建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 回复  |  直到 6 年前
        1
  •  0
  •   Frederik De Ruyck    6 年前

    在Qt安装文件夹中,检查qtnetwork config.h文件 它包含启用/禁用代码Qt代码的标志,具体取决于配置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时会发生什么。。。

    这有待进一步调查。 无论如何,要找出导致警告的原因,请安装messagehandler:

    // 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);
    

    您应该点击消息处理程序中的断点并查看消息的来源。

        2
  •  0
  •   David Feurle    6 年前

    TLSv1.1 must die die die .

    QNetworkRequest request(url);
    QSslConfiguration config = request.sslConfiguration();
    config.setProtocol(QSsl::TlsV1_2);
    
    推荐文章