不使用SSL时出现QSslSocket错误

时间:2014-10-14 12:44:21

标签: qt ssl qsslsocket

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

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开发库。

问题是:如何摆脱这些警告?

4 个答案:

答案 0 :(得分:18)

这些只是在解析OpenSSL函数时从qWarning()调用。它不是试图调用这些函数,只是解决它们。调用未解析的函数会导致QSslSocket: cannot call unresolved function ...警告。

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

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

  1. 忽略它们,因为您无论如何都不想要或不需要SSL
  2. 重新编译Qt,-no-openssl传递给configure
  3. 运送OpenSSL,因此功能得到解决,https可用 - 可能不是您想要的

答案 1 :(得分:4)

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

public function check(year as integer)
dim boo as string
boo="me.ch" & year
if boo then
...
end if
end function

我们确定这是因为,虽然我们也没有使用SSL,但程序在客户的计算机上找到了OpenSSL的副本并尝试与它连接。它找到的版本太旧了(from Qt 5.2 onwards v1.0.0或更高版本是必需的)。

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

答案 2 :(得分:4)

可以使用QLoggingCategory::setFilterRules("qt.network.ssl.w arning=false");

禁用相关警告消息

答案 3 :(得分:1)

您是否尝试过QSslSocket::ignoreSslErrors