不使用 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 错误