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

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

当解析OpenSSL函数时,这些只是来自qWarning()调用。它不是试图调用这些函数,而是解析它们。调用未解析的函数将导致QSslSocket: cannot call unresolved function ...警告。

该警告是由于OpenSSL函数在运行时通过调用QNetworkAccessManager::supportedSchemesImplementation()中的QSslSocket::supportsSsl() static来解析,该调用返回受支持的架构http,如果SSL支持https,则返回。

关于这些警告,你几乎没有选择,

  1. 忽略它们,因为您无论如何都不想要或不需要SSL
  2. 用传递给configure-no-openssl重新编译Qt
  3. 提供OpenSSL,以便解析函数并提供https—可能不是您想要的

可以使用QLoggingCategory::setFilterRules("qt.network.ssl.w arning=false"); 禁用相关警告消息

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

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的副本,并尝试与之接口。不过,它发现的版本太旧了(从Qt 5.2开始,需要v1.0.0或更高版本)。

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

您尝试过QSslSocket::ignoreSslErrors吗?

相关内容

  • 没有找到相关文章

最新更新