不使用 SSL 时出现 QSslSocket 错误

Posted

技术标签:

【中文标题】不使用 SSL 时出现 QSslSocket 错误【英文标题】:QSslSocket error when SSL is NOT used 【发布时间】:2014-10-14 12:44:20 【问题描述】:

我在我的两个 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 开发库。

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

【问题讨论】:

【参考方案1】:

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

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

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

    忽略它们,因为您不想要或不需要 SSL 重新编译Qt,将-no-openssl传递给configure 发布 OpenSSL,以便解析函数并使用 https - 可能不是您想要的

【讨论】:

很好的解释,谢谢!通常我不想直接忽略 my 程序的输出,但它看起来是这里的最佳解决方案。 此外,您还可以通过设置环境变量 QT_LOGGING_RULES=qt.network.ssl.warning=false 来禁用这些消息 虽然不好,我最好看到警告并忽略它们,而不是隐藏它们,以后我可能会遇到麻烦并且我不知道发生了什么,警告有助于调试。 我如何“运送 OpenSSL”?【参考方案2】:

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

【讨论】:

有趣的是,即使有额外的空间,它也能正常工作。它完全没有“.warning”。去图...【参考方案3】:

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

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 的副本并尝试与之交互。但它找到的版本太旧了(需要from Qt 5.2 onwards v1.0.0 或更高版本)。

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

【讨论】:

【参考方案4】:

你试过QSslSocket::ignoreSslErrors吗?

【讨论】:

我不使用 QSslSocket,我没有对象可以使用它。根本没有使用 SSL 的意图。我会将其编辑为原始答案以使其清楚。 我试过了,还是没有解决问题:警告仍然出现,程序仍然冻结。

以上是关于不使用 SSL 时出现 QSslSocket 错误的主要内容,如果未能解决你的问题,请参考以下文章

从 AWS EC2 实例上的 github 企业克隆时出现 SSL 错误

使用 PIP 时出现“SSL:CERTIFICATE_VERIFY_FAILED”错误

使用 Active Merchant 和 PayPal 时出现 SSL 错误

cURL 错误 60:尝试使用 symfony 时出现 ssl 认证问题

使用SSL配置nginx反向代理时出现400错误请求错误。

使用 smtp 和 Python 发送电子邮件时出现 SSL 错误