Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 未使用SSL时发生QSslSocket错误_Qt_Ssl_Qsslsocket - Fatal编程技术网

Qt 未使用SSL时发生QSslSocket错误

Qt 未使用SSL时发生QSslSocket错误,qt,ssl,qsslsocket,Qt,Ssl,Qsslsocket,我在我的两个Qt应用程序中注意到了这个输出,它们使用QNetworkRequest通过QNetworkRequest从外部加载一些数据: QSslSocket: cannot resolve TLSv1_1_client_method QSslSocket: cannot resolve TLSv1_2_client_method QSslSocket: cannot resolve TLSv1_1_server_method QSslSocket: cannot resolve TLSv1_2

我在我的两个Qt应用程序中注意到了这个输出,它们使用QNetworkRequest通过QNetworkRequest从外部加载一些数据:

QSslSocket: cannot resolve TLSv1_1_client_method
QSslSocket: cannot resolve TLSv1_2_client_method
QSslSocket: cannot resolve TLSv1_1_server_method
QSslSocket: cannot resolve TLSv1_2_server_method
QSslSocket: cannot resolve SSL_select_next_proto
QSslSocket: cannot resolve SSL_CTX_set_next_proto_select_cb
QSslSocket: cannot resolve SSL_get0_next_proto_negotiated
导致出现这些警告的请求的一个示例是

QNetworkReply reply = m_nam->get(QNetworkRequest(QUrl("http://api.openweathermap.org/data/2.5/forecast?id=2835297&mode=xml")));
我可以合理地确定,任何查询都不涉及TLS/SSL,所有查询都是纯HTTP。无论URL如何,消息总是在发送第一个请求后出现我根本不打算使用SSL,代码中没有提到SSL,这意味着我不能以编程方式忽略警告

我的安装程序是Windows 7 64位、MSVC2013和MinGW、Qt 5.3.2。无论使用哪种编译器,消息都会显示。未安装OpenSSL或其他SSL开发库


问题是:如何消除这些警告?

您尝试过吗?

这些只是在解决OpenSSL函数时的qWarning()调用。它不是试图调用这些函数,而是解析它们。调用未解析函数将导致
QSslSocket:无法调用未解析函数…
警告

该警告是OpenSSL函数在运行时通过调用
QNetworkAccessManager::supportedSchemesImplementation()
中的
QSslSocket::supportsSsl()
static来解析的结果,该函数返回支持的模式--
http
,如果支持SSL
https

对于这些警告,您几乎没有选择

  • 忽略它们,因为您无论如何都不想要或不需要SSL
  • 使用
    重新编译Qt-未向
    配置传递openssl
  • 提供OpenSSL,以便解析函数并使
    https
    可用-可能不是您想要的

  • 我们偶尔会有客户收到非常类似的警告信息,但软件也崩溃了

    QSslSocket: cannot resolve TLSv1_1_client_method
    QSslSocket: cannot resolve TLSv1_2_client_method
    QSslSocket: cannot resolve TLSv1_1_server_method
    QSslSocket: cannot resolve TLSv1_2_server_method
    QSslSocket: cannot resolve SSL_select_next_proto
    QSslSocket: cannot resolve SSL_CTX_set_next_proto_select_cb
    QSslSocket: cannot resolve SSL_get0_next_proto_negotiated
    QMutex: destroying locked mutex
    
    我们确定这是因为,尽管我们也没有使用SSL,但该程序在客户的计算机上找到了OpenSSL的副本,并尝试与之交互。但找到的版本太旧(需要v1.0.0或更高版本)


    我们的解决方案是将OpenSSL DLL与我们的应用程序一起分发(~1.65MB)。另一种方法是在不支持OpenSSL的情况下从头开始编译Qt。

    可以使用
    QLoggingCategory::setFilterRules(“Qt.network.ssl.w arning=false”)禁用相关警告消息

    我不使用QSslSocket,我没有对象可以使用它。根本不打算使用SSL。我将把它编辑到原始答案中,让它更清晰。我尝试过,但它并没有解决问题:警告仍然出现,程序仍然冻结。非常好的解释,谢谢!通常我不喜欢直接忽略我的程序输出,但它看起来是这里的最佳解决方案。此外,您还可以通过设置环境变量QT_LOGGING_RULES=QT.network.ssl.warning=false来禁用这些消息。但这并不好,我最好看到警告并忽略它们,而不是隐藏它们,稍后我可能会遇到麻烦,我不知道发生了什么,警告有助于调试。我如何“发布OpenSSL”?有趣的是,它甚至可以在额外的空间中工作。而且它完全没有“.warning”选项。想想看。。。